我正在尝试使用Vivado模拟AXI4(Full)主控。它应该在从属端写入以下值(在我的情况下,这将是我的zedboard PS中的一些寄存器)
0x0000fe01 to 0xe000a204
0x0000fe01 to 0xe000a208
0x00000001 to 0xe000a040
这是块级设计。
当我运行行为综合时,它有效。
然而,当我尝试运行后综合功能模拟(据说更接近实际设计并包括门延迟)时,我得到一些不确定的值
如果您需要检查,这是完整的项目和主IP。
vivado project(using vivado 2015.2) axi_controller
以下是自上而下的单个verilog文件(仅为了便于访问):
axi_controller_v1_1.v(这是我为FSM进行状态计算的地方,我将状态发送到接口单元,以便它可以为端口分配适当的值)
axi_controller_v1_1_M00_AXI.v(这是IP中的接口单元)
我已将问题缩小到我的代码中的这一部分。
//state updation
always @(posedge m00_axi_aclk) begin
if(m00_axi_aresetn==1'b0) begin
cur<=t_0;
next<=t_0;
end
else begin
cur<=next;
end
end
//state calculation
always @(*) begin
case(cur)
t_0: begin
if(m00_axi_init_axi_txn) next=t_1;
else next=t_0;
end
t_1: begin
next=t_2;
end
t_2: begin
if(m00_axi_awready) begin
if(m00_axi_wready) next=t_4;
else next=t_3;
end
else next=t_2;
end
t_3: begin
if(m00_axi_wready) next=t_4;
else next=t_3;
end
t_4: begin
if(m00_axi_awready) begin
if(m00_axi_wready) next=t_6;
else next=t_5;
end
else next=t_4;
end
t_5: begin
if(m00_axi_wready) next=t_6;
else next=t_5;
end
t_6: begin
next=t_6;
end
default next=t_0;
endcase
end
其中,
parameter t_0=3'b000,
parameter t_1=3'b001,
parameter t_2=3'b010,
parameter t_3=3'b011,
parameter t_4=3'b100,
parameter t_5=3'b101,
parameter t_6=3'b110,
当100ns
从INIT_AXI_TRANS
更改为0
1
变为next
时,00x
因为cur
是000
(或t_0
),所以应该实施第一个案例。当next
变为00x
时,我认为它无法确定INIT_AXI_TRANS
是0
还是1
。然后,这种效应会在电路的其余部分传播。
任何人都可以帮助我找出我如何解决这个问题 提前谢谢。
我做了第一条评论中建议的内容,并在此处和git存储库中更新了代码。可悲的是,似乎这不是问题,因为我仍然得到相同的结果。
答案 0 :(得分:0)
您正在多个进程中为next分配值。在重置过程和状态变化过程中。