1

我有一个非常简单的电路来更新我的 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被断言时注册(其他一些转换也依赖于此)。所以,我注册startlastStart,等待条件,然后采取适当的行动。

我正在使用 Vivado 2015.4 和vSim XSim,以及 Kintex Ultrascale 060。经过精心/综合后,我得到以下电路原理图:

阐述示意图

合成后示意图 我的功能/RTL 模拟符合我的预期。但是,由于该设计在电路板上无法正常运行,我选择尝试综合后仿真,并得到以下结果: 综合后模拟 如图所示,start由我的测试台提出,并且 Vivado 插入的 IBUF 的输出产生相同的值. 但是,由于未知原因,lastStart无法在两个时钟沿中的任何一个start为高电平时捕获值(t=35ns,t=45ns)。此外,尽管start&&!lastStart很高,ruleCountReg但也不会更新。

为了比较,这里是功能 RTL 模拟: 功能 RTL 模拟 这是 Vivado 中的错误吗?Verilog 是微不足道的,它似乎正在为电路生成正确的原理图,但它会创建一个不正确的网表吗?综合不会产生任何与这些信号相关的警告。


编辑:似乎 xSim 在模拟的前 100ns 期间没有更新任何寄存器。

时序模拟(后合成器)

4

1 回答 1

3

根据 Xilinx UG900,这是预期的行为。

在综合后和实现后仿真中,GSR(全局设置/复位)信号在前 100 ns 内自动置位,以模拟配置后发生的复位。

所以这是愚蠢的,但故意的。

于 2016-05-19T17:23:18.200 回答