【问题标题】:Verilog - Changing a reg in sensitivity list in Always blockVerilog - 在 Always 阻止中更改敏感度列表中的 reg
【发布时间】:2021-03-04 20:49:25
【问题描述】:
reg A,B,C;
always @(*)begin
//some other computations
C=B;
//some other computations
A=C;
end

always @(posedge clk)begin
B<=A;
end

你好,

在上面的代码中,在 clk 的 posedge reg A 改变了 reg B 的值,并且由于 B 在敏感列表中,这开始了第一个 always 阻塞的过程。我的问题是“C=B”行会发生什么,因为 reg C 也在敏感列表中?这会再次启动第一个循环的过程并导致无限循环吗?

我在模拟中检查了它,它工作正常。但我不知道硬件上会发生什么。

我的猜测是它不会造成问题。由于 Verilog 只创建一个 LUT 来模拟 always 块内部的算法,因此不会导致硬件问题。但是,我不确定,所以我想问一下。

谢谢,

【问题讨论】:

    标签: verilog vivado


    【解决方案1】:

    请记住,过程代码一次执行一条语句。您的代码的有效解释与

    相同
    initial begin
           @(B or C) // wait for a change on B or C
           C = B;
           A = C;
           @(B or C) // wait for a change on B or C
           C = B;
           A = C;
           @(B or C) // wait for a change on B or C
           C = B;
           A = C;
           ...
           end
    

    C 的分配发生了,但是在您到达下一个@ 之前,对C 的任何更改都已经发生了。综合将C 解释为一个中间值。

    【讨论】:

    • 感谢您的回答。非常清楚。但是我想问一下我的新疑问:) code always @(*)begin C=B; ... C=C+1; ... end 在上面的代码中,使用C作为加法运算的输入输出reg会不会有问题?喜欢使用 LUT 进行此操作而不是 DSP,或者其他一些时序问题的性能?谢谢
    • 简单地变成C = B + 1
    • 谢谢。最后,我应该寻找更多关于编译器或合成器如何决定它的信息吗?
    • 查看合成工具的文档。还有很多关于 RTL 合成编码指南的网站,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多