我有一个非常简单的电路来更新我的IP核中的寄存器。
input clk;
input rst;
input start;
input [31:0] ruleCount;
reg lastStart;
output reg [31:0] ruleCountReg;
always@(posedge clk)
if (rst)
lastStart <= 0;
else
lastStart <= start;
always@(posedge clk)
if (rst) begin
ruleCountReg <= 0;
end
else if (start && !lastStart) begin
ruleCountReg <= ruleCount;
end
这里的目标是在第一个周期注册ruleCount
start
被断言(其他一些传统也取决于此)。所以,我将start
注册到lastStart
,等待条件,然后采取适当的行动。
我使用的是Vivado 2015.4和 vSim XSim,以及Kintex Ultrascale 060.经过精心设计/综合后,我得到了以下电路原理图:
我的功能/ RTL仿真符合我的期望。但是,由于设计在电路板上没有运行,我选择尝试后综合模拟,并得到以下结果:
如图所示,我的测试平台引发start
,Vivado插入的IBUF输出产生相同的值。但是,由于未知原因,lastStart
在start
为高(t = 35ns,t = 45ns)时无法捕获两个时钟边沿中任何一个的值。此外,尽管start&&!lastStart
为高ruleCountReg
,401 unauthorized
也不会更新。
为了比较,这里是功能性RTL模拟: 这是Vivado的错误吗? Verilog是微不足道的,它似乎正在为电路生成正确的原理图,但是它可能会创建一个不正确的网表吗?综合不会产生与这些信号相关的任何警告。
编辑:似乎xSim在模拟的前100ns内没有更新任何寄存器。
答案 0 :(得分:2)