fix(sim): fix simulation errors
This commit is contained in:
@@ -134,6 +134,12 @@ initial begin
|
||||
end
|
||||
end
|
||||
|
||||
localparam SAFE_EXP_MSB = (AXIL_ADDR_BIT_OFFSET > AXI_ADDR_BIT_OFFSET) ? AXIL_ADDR_BIT_OFFSET - 1 : AXI_ADDR_BIT_OFFSET;
|
||||
localparam SAFE_EXP_LSB = AXI_ADDR_BIT_OFFSET;
|
||||
|
||||
localparam SAFE_NAR_MSB = (AXI_ADDR_BIT_OFFSET > AXIL_ADDR_BIT_OFFSET) ? AXI_ADDR_BIT_OFFSET - 1 : AXIL_ADDR_BIT_OFFSET;
|
||||
localparam SAFE_NAR_LSB = AXIL_ADDR_BIT_OFFSET;
|
||||
|
||||
localparam [1:0]
|
||||
STATE_IDLE = 2'd0,
|
||||
STATE_DATA = 2'd1,
|
||||
@@ -286,7 +292,7 @@ always @* begin
|
||||
|
||||
if (m_axil_rready && m_axil_rvalid) begin
|
||||
s_axi_rid_next = id_reg;
|
||||
s_axi_rdata_next = m_axil_rdata >> (addr_reg[AXIL_ADDR_BIT_OFFSET-1:AXI_ADDR_BIT_OFFSET] * AXI_DATA_WIDTH);
|
||||
s_axi_rdata_next = m_axil_rdata >> (addr_reg[SAFE_EXP_MSB:SAFE_EXP_LSB] * AXI_DATA_WIDTH);
|
||||
s_axi_rresp_next = m_axil_rresp;
|
||||
s_axi_rlast_next = 1'b0;
|
||||
s_axi_rvalid_next = 1'b1;
|
||||
@@ -316,7 +322,7 @@ always @* begin
|
||||
s_axi_rid_next = id_reg;
|
||||
data_next = m_axil_rdata;
|
||||
resp_next = m_axil_rresp;
|
||||
s_axi_rdata_next = m_axil_rdata >> (addr_reg[AXIL_ADDR_BIT_OFFSET-1:AXI_ADDR_BIT_OFFSET] * AXI_DATA_WIDTH);
|
||||
s_axi_rdata_next = m_axil_rdata >> (addr_reg[SAFE_EXP_MSB:SAFE_EXP_LSB] * AXI_DATA_WIDTH);
|
||||
s_axi_rresp_next = m_axil_rresp;
|
||||
s_axi_rlast_next = 1'b0;
|
||||
s_axi_rvalid_next = 1'b1;
|
||||
@@ -346,7 +352,7 @@ always @* begin
|
||||
|
||||
if (s_axi_rready || !s_axi_rvalid) begin
|
||||
s_axi_rid_next = id_reg;
|
||||
s_axi_rdata_next = data_reg >> (addr_reg[AXIL_ADDR_BIT_OFFSET-1:AXI_ADDR_BIT_OFFSET] * AXI_DATA_WIDTH);
|
||||
s_axi_rdata_next = data_reg >> (addr_reg[SAFE_EXP_MSB:SAFE_EXP_LSB] * AXI_DATA_WIDTH);
|
||||
s_axi_rresp_next = resp_reg;
|
||||
s_axi_rlast_next = 1'b0;
|
||||
s_axi_rvalid_next = 1'b1;
|
||||
@@ -412,7 +418,7 @@ always @* begin
|
||||
m_axil_rready_next = !s_axi_rvalid && !m_axil_arvalid;
|
||||
|
||||
if (m_axil_rready && m_axil_rvalid) begin
|
||||
data_next[addr_reg[AXI_ADDR_BIT_OFFSET-1:AXIL_ADDR_BIT_OFFSET]*SEGMENT_DATA_WIDTH +: SEGMENT_DATA_WIDTH] = m_axil_rdata;
|
||||
data_next[addr_reg[SAFE_NAR_MSB:SAFE_NAR_LSB]*SEGMENT_DATA_WIDTH +: SEGMENT_DATA_WIDTH] = m_axil_rdata;
|
||||
if (m_axil_rresp) begin
|
||||
resp_next = m_axil_rresp;
|
||||
end
|
||||
|
||||
@@ -146,6 +146,12 @@ localparam [1:0]
|
||||
STATE_DATA_2 = 2'd2,
|
||||
STATE_RESP = 2'd3;
|
||||
|
||||
// 添加安全的位选边界,防止 ModelSim 报 Range Reversed 错误
|
||||
localparam SAFE_EXP_MSB = (AXIL_ADDR_BIT_OFFSET > AXI_ADDR_BIT_OFFSET) ? AXIL_ADDR_BIT_OFFSET - 1 : AXI_ADDR_BIT_OFFSET;
|
||||
localparam SAFE_EXP_LSB = AXI_ADDR_BIT_OFFSET;
|
||||
|
||||
localparam SAFE_NAR_MSB = (AXI_ADDR_BIT_OFFSET > AXIL_ADDR_BIT_OFFSET) ? AXI_ADDR_BIT_OFFSET - 1 : AXIL_ADDR_BIT_OFFSET;
|
||||
localparam SAFE_NAR_LSB = AXIL_ADDR_BIT_OFFSET;
|
||||
reg [1:0] state_reg = STATE_IDLE, state_next;
|
||||
|
||||
reg [AXI_ID_WIDTH-1:0] id_reg = {AXI_ID_WIDTH{1'b0}}, id_next;
|
||||
@@ -335,7 +341,7 @@ always @* begin
|
||||
|
||||
if (s_axi_wready && s_axi_wvalid) begin
|
||||
m_axil_wdata_next = {(AXIL_WORD_WIDTH/AXI_WORD_WIDTH){s_axi_wdata}};
|
||||
m_axil_wstrb_next = s_axi_wstrb << (addr_reg[AXIL_ADDR_BIT_OFFSET-1:AXI_ADDR_BIT_OFFSET] * AXI_STRB_WIDTH);
|
||||
m_axil_wstrb_next = s_axi_wstrb << (addr_reg[SAFE_EXP_MSB:SAFE_EXP_LSB] * AXI_STRB_WIDTH);
|
||||
m_axil_wvalid_next = 1'b1;
|
||||
burst_next = burst_reg - 1;
|
||||
burst_active_next = burst_reg != 0;
|
||||
@@ -354,13 +360,13 @@ always @* begin
|
||||
if (CONVERT_NARROW_BURST) begin
|
||||
for (i = 0; i < AXI_WORD_WIDTH; i = i + 1) begin
|
||||
if (s_axi_wstrb[i]) begin
|
||||
data_next[addr_reg[AXIL_ADDR_BIT_OFFSET-1:AXI_ADDR_BIT_OFFSET]*SEGMENT_DATA_WIDTH+i*AXIL_WORD_SIZE +: AXIL_WORD_SIZE] = s_axi_wdata[i*AXIL_WORD_SIZE +: AXIL_WORD_SIZE];
|
||||
strb_next[addr_reg[AXIL_ADDR_BIT_OFFSET-1:AXI_ADDR_BIT_OFFSET]*SEGMENT_STRB_WIDTH+i] = 1'b1;
|
||||
data_next[addr_reg[SAFE_EXP_MSB:SAFE_EXP_LSB]*SEGMENT_DATA_WIDTH+i*AXIL_WORD_SIZE +: AXIL_WORD_SIZE] = s_axi_wdata[i*AXIL_WORD_SIZE +: AXIL_WORD_SIZE];
|
||||
strb_next[addr_reg[SAFE_EXP_MSB:SAFE_EXP_LSB]*SEGMENT_STRB_WIDTH+i] = 1'b1;
|
||||
end
|
||||
end
|
||||
end else begin
|
||||
data_next[addr_reg[AXIL_ADDR_BIT_OFFSET-1:AXI_ADDR_BIT_OFFSET]*SEGMENT_DATA_WIDTH +: SEGMENT_DATA_WIDTH] = s_axi_wdata;
|
||||
strb_next[addr_reg[AXIL_ADDR_BIT_OFFSET-1:AXI_ADDR_BIT_OFFSET]*SEGMENT_STRB_WIDTH +: SEGMENT_STRB_WIDTH] = s_axi_wstrb;
|
||||
data_next[addr_reg[SAFE_EXP_MSB:SAFE_EXP_LSB]*SEGMENT_DATA_WIDTH +: SEGMENT_DATA_WIDTH] = s_axi_wdata;
|
||||
strb_next[addr_reg[SAFE_EXP_MSB:SAFE_EXP_LSB]*SEGMENT_STRB_WIDTH +: SEGMENT_STRB_WIDTH] = s_axi_wstrb;
|
||||
end
|
||||
m_axil_wdata_next = data_next;
|
||||
m_axil_wstrb_next = strb_next;
|
||||
@@ -451,8 +457,8 @@ always @* begin
|
||||
if (s_axi_wready && s_axi_wvalid) begin
|
||||
data_next = s_axi_wdata;
|
||||
strb_next = s_axi_wstrb;
|
||||
m_axil_wdata_next = s_axi_wdata >> (addr_reg[AXI_ADDR_BIT_OFFSET-1:AXIL_ADDR_BIT_OFFSET] * AXIL_DATA_WIDTH);
|
||||
m_axil_wstrb_next = s_axi_wstrb >> (addr_reg[AXI_ADDR_BIT_OFFSET-1:AXIL_ADDR_BIT_OFFSET] * AXIL_STRB_WIDTH);
|
||||
m_axil_wdata_next = s_axi_wdata >> (addr_reg[SAFE_NAR_MSB:SAFE_NAR_LSB] * AXIL_DATA_WIDTH);
|
||||
m_axil_wstrb_next = s_axi_wstrb >> (addr_reg[SAFE_NAR_MSB:SAFE_NAR_LSB] * AXIL_STRB_WIDTH);
|
||||
m_axil_wvalid_next = 1'b1;
|
||||
burst_next = burst_reg - 1;
|
||||
burst_active_next = burst_reg != 0;
|
||||
@@ -469,8 +475,8 @@ always @* begin
|
||||
s_axi_wready_next = 1'b0;
|
||||
|
||||
if (!m_axil_wvalid || m_axil_wready) begin
|
||||
m_axil_wdata_next = data_reg >> (addr_reg[AXI_ADDR_BIT_OFFSET-1:AXIL_ADDR_BIT_OFFSET] * AXIL_DATA_WIDTH);
|
||||
m_axil_wstrb_next = strb_reg >> (addr_reg[AXI_ADDR_BIT_OFFSET-1:AXIL_ADDR_BIT_OFFSET] * AXIL_STRB_WIDTH);
|
||||
m_axil_wdata_next = data_reg >> (addr_reg[SAFE_NAR_MSB:SAFE_NAR_LSB] * AXIL_DATA_WIDTH);
|
||||
m_axil_wstrb_next = strb_reg >> (addr_reg[SAFE_NAR_MSB:SAFE_NAR_LSB] * AXIL_STRB_WIDTH);
|
||||
m_axil_wvalid_next = 1'b1;
|
||||
addr_next = (addr_reg + (1 << master_burst_size_reg)) & ({ADDR_WIDTH{1'b1}} << master_burst_size_reg);
|
||||
last_segment_next = addr_next[burst_size_reg] != addr_reg[burst_size_reg];
|
||||
|
||||
Reference in New Issue
Block a user