我有一个非常简单的电路来更新我的 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
但也不会更新。
为了比较,这里是功能 RTL 模拟: 这是 Vivado 中的错误吗?Verilog 是微不足道的,它似乎正在为电路生成正确的原理图,但它会创建一个不正确的网表吗?综合不会产生任何与这些信号相关的警告。
编辑:似乎 xSim 在模拟的前 100ns 期间没有更新任何寄存器。