blob: 8c2d5ca0e7e5925e7b5934b11ff8c66ab8fd9c2f [file] [log] [blame]
//****************************************************************************
//
// Copyright 2017-2023 Vivante Corporation
//
// Portions Copyright (c) 2003 Silicon Image GmbH, used with permission
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//****************************************************************************
// Auto-generated file on 11/03/2023.
//
//****************************************************************************
module vsisp_bvci2axi_wr
(
clk,
reset_n,
bvci_cmdval,
bvci_cmdack,
bvci_cmd,
bvci_plen,
bvci_contig,
bvci_wrap,
bvci_address,
bvci_be,
bvci_eop,
bvci_rspval,
bvci_rspack,
bvci_reop,
bvci_wdata,
axi_wr_marvin_awvalid,
axi_wr_marvin_awaddr,
axi_wr_marvin_awlen,
axi_wr_marvin_awsize,
axi_wr_marvin_awburst,
axi_wr_marvin_awlock,
axi_wr_marvin_awcache,
axi_wr_marvin_awprot,
axi_wr_marvin_awid,
axi_wr_marvin_awready,
axi_wr_marvin_wvalid,
axi_wr_marvin_wlast,
axi_wr_marvin_wdata,
axi_wr_marvin_wstrb,
axi_wr_marvin_wid,
axi_wr_marvin_wready,
axi_wr_marvin_bvalid,
axi_wr_marvin_bresp,
axi_wr_marvin_bid,
axi_wr_marvin_bready
);
input clk;
input reset_n;
input bvci_cmdval;
output bvci_cmdack;
input [1:0] bvci_cmd;
input [8:0] bvci_plen;
input bvci_contig;
input bvci_wrap;
input [31:3] bvci_address;
input [7:0] bvci_be;
input bvci_eop;
output bvci_rspval;
input bvci_rspack;
output bvci_reop;
input [63:0] bvci_wdata;
output axi_wr_marvin_awvalid;
output [31:3] axi_wr_marvin_awaddr;
output [3:0] axi_wr_marvin_awlen;
output [2:0] axi_wr_marvin_awsize;
output [1:0] axi_wr_marvin_awburst;
output [1:0] axi_wr_marvin_awlock;
output [3:0] axi_wr_marvin_awcache;
output [2:0] axi_wr_marvin_awprot;
output [3:0] axi_wr_marvin_awid;
input axi_wr_marvin_awready;
output axi_wr_marvin_wvalid;
output axi_wr_marvin_wlast;
output [63:0] axi_wr_marvin_wdata;
output [7:0] axi_wr_marvin_wstrb;
output [3:0] axi_wr_marvin_wid;
input axi_wr_marvin_wready;
input axi_wr_marvin_bvalid;
input [1:0] axi_wr_marvin_bresp;
input [3:0] axi_wr_marvin_bid;
output axi_wr_marvin_bready;
reg [31:3] axi_wr_marvin_awaddr;
reg [63:0] axi_wr_marvin_wdata;
reg axi_wr_marvin_wvalid;
reg axi_wr_marvin_awvalid;
reg [3:0] axi_wr_marvin_awlen;
reg axi_wr_marvin_wlast;
reg [1:0] viv_s0;
parameter c_cmd_idle = 2'b00;
parameter c_cmd_set = 2'b01;
parameter c_cmd_hold = 2'b10;
parameter c_cmd_late = 2'b11;
reg bvci_rspval;
reg bvci_reop;
wire [4:0] viv_s1;
always @(posedge clk or negedge reset_n) begin
if (!reset_n) begin
axi_wr_marvin_awvalid <= 1'b0;
viv_s0 <= c_cmd_idle;
end else begin
case (viv_s0)
c_cmd_set : begin
case ({axi_wr_marvin_awready,
axi_wr_marvin_wlast & axi_wr_marvin_wready})
2'b10: begin
axi_wr_marvin_awvalid <= 1'b0;
viv_s0 <= c_cmd_hold;
end
2'b11: begin
axi_wr_marvin_awvalid <= 1'b0;
viv_s0 <= c_cmd_idle;
end
2'b01: begin
axi_wr_marvin_awvalid <= 1'b1;
viv_s0 <= c_cmd_late;
end
default: begin
axi_wr_marvin_awvalid <= 1'b1;
viv_s0 <= c_cmd_set;
end
endcase
end
c_cmd_hold : begin
if (axi_wr_marvin_wlast & axi_wr_marvin_wready) begin
axi_wr_marvin_awvalid <= 1'b0;
viv_s0 <= c_cmd_idle;
end else begin
axi_wr_marvin_awvalid <= 1'b0;
viv_s0 <= c_cmd_hold;
end
end
c_cmd_late : begin
if (axi_wr_marvin_awready) begin
axi_wr_marvin_awvalid <= 1'b0;
viv_s0 <= c_cmd_idle;
end else begin
axi_wr_marvin_awvalid <= 1'b1;
viv_s0 <= c_cmd_late;
end
end
default : begin
if ((bvci_cmd == 2'b10) && bvci_cmdval) begin
axi_wr_marvin_awvalid <= 1'b1;
viv_s0 <= c_cmd_set;
end else begin
axi_wr_marvin_awvalid <= 1'b0;
viv_s0 <= c_cmd_idle;
end
end
endcase
end
end
assign viv_s1 = bvci_plen[7:3] - 5'b1;
always @(posedge clk or negedge reset_n) begin
if (!reset_n) begin
axi_wr_marvin_wvalid <= 1'd0;
axi_wr_marvin_awlen <= 4'd0;
axi_wr_marvin_awaddr <= 29'd0;
axi_wr_marvin_wdata <= 64'd0;
axi_wr_marvin_wlast <= 1'b0;
end else begin
if (axi_wr_marvin_wlast & axi_wr_marvin_wready) begin
axi_wr_marvin_wvalid <= 1'b0;
axi_wr_marvin_wlast <= 1'b0;
end else if ((!axi_wr_marvin_wvalid | axi_wr_marvin_wready) &&
(viv_s0 != c_cmd_late)) begin
axi_wr_marvin_wvalid <= bvci_cmdval;
axi_wr_marvin_awlen <= viv_s1[3:0];
axi_wr_marvin_wdata <= bvci_wdata;
if (bvci_cmdval && bvci_cmdack) begin
axi_wr_marvin_wlast <= bvci_eop;
end
if (viv_s0 == c_cmd_idle) begin
axi_wr_marvin_awaddr <= bvci_address;
end
end
end
end
assign axi_wr_marvin_awsize = 3'b011;
assign axi_wr_marvin_awburst = 2'b01;
assign axi_wr_marvin_awlock = 2'b00;
assign axi_wr_marvin_awcache = 4'b0000;
assign axi_wr_marvin_awprot = 3'b000;
assign axi_wr_marvin_awid = 4'b0000;
assign axi_wr_marvin_wstrb = 8'b11111111;
assign axi_wr_marvin_wid = 4'b0;
assign axi_wr_marvin_bready = 1'b1;
assign bvci_cmdack = ((!axi_wr_marvin_wvalid | axi_wr_marvin_wready) &
!axi_wr_marvin_wlast & (viv_s0 != c_cmd_late));
always @(posedge clk or negedge reset_n) begin
if (!reset_n) begin
bvci_rspval <= 1'h0;
end else begin
if (axi_wr_marvin_wready) begin
bvci_rspval <= 1'b1;
end
else begin
bvci_rspval <= 1'b0;
end
end
end
always @(posedge clk or negedge reset_n) begin
if (!reset_n) begin
bvci_reop <= 1'h0;
end else begin
if (axi_wr_marvin_bvalid) begin
bvci_reop <= 1'b1;
end
else begin
bvci_reop <= 1'b0;
end
end
end
endmodule