【问题标题】:Concurrent Always blocks in VerilogVerilog 中的并发 Always 块
【发布时间】:2017-08-08 16:38:50
【问题描述】:

我偶然发现了一些代码,这些代码似乎是完全正常的 verilog 风格,但对我来说看起来相当危险(我是 Verilog 的新手)。它总是关于并发的总是块和/或分配。这是一个例子:

module some(input clk_i);

..
    module ram(
          input   wire                a_clk,
          input   wire                a_wr,
          input   wire    [ADDR-1:0]  a_addr,
          input   wire    [DATA-1:0]  a_din,
          output  reg     [DATA-1:0]  a_dout,
    );

    reg [DATA-1:0] mem [(2**ADDR)-1:0];


    always @(posedge a_clk) begin
          a_dout      <= mem[a_addr];
          if(a_wr) begin
              a_dout      <= a_din;
              mem[a_addr] <= a_din;
          end
    end

    endmodule
..

reg wrmem=1'b0;
reg[ADDR-1:0] memaddr;
reg[DATA-1:0] d_in;


ram mem(.a_clk(clk_i),.a_wr(wrmem),.a_addr(memaddr),.a_din(d_in),.a_dout(memout));

..

always @(posedge clk_i) begin
    wrmem <= 1'b0;
        ...
        if(..) begin
            d_in <= sth.
            memaddr <= some address
            wrmem <= 1b'1;
    end
end

endmodule;  

所以这里我们有两个并发的always-blocks。第一个(在模块“ram”中)对时钟和“reg a_wr”为高做出反应。在第二个中,这个 'reg' 设置为 0 并在几步之后再次设置为 1。为什么这不会导致模块“ram”的任意行为(因为第一个块不会等到第二个块完成)?

【问题讨论】:

  • 在第二个中,这个“reg”设置为 0,几步之后又设置为 1 - 在哪里?我看到两个不同的名字wrmemwrem。无论如何,看起来像 stackoverflow.com/questions/15718192/… 的副本
  • 抱歉打错了

标签: concurrency verilog fpga vivado


【解决方案1】:

这正是verilog中存在非阻塞赋值的原因。

Verilog 调度由每个增量周期的多个存储桶组成。 阻塞分配之后,大致非阻塞分配在单独的调度桶中执行。

所以,在你的情况下,你有两件事:

always @(posedge clk) 
    if (wreg)
       ...

always @(posedge clk)
    wreg <= 0;
    ...

在模拟中,第一个块将使用 'wreg' 的值,因为它在执行非阻塞存储桶之前存在,可能是1

第二个块将调度在非阻塞桶中将 wreg 更新为 0,尚未执行。所以,没有冲突。

因此,您可以保证在模拟过程中获得一致的结果。

【讨论】:

  • 所以 if (wreg)-block 在第二个 always-block 中 wreg 设置为 1 之后的一个周期执行,对吧?
  • 是同一个模拟周期,但同一个周期内不同的bucket。
  • 但是,假设我们从 wreg = 0 开始,在第一个循环中 wreg 设置为 1:1。循环:[1。 if(wreg) 为假,2. wreg 的事件
  • 是的。它是正确的。这就是失败设计在硅中的工作方式。第二个语句代表 wreg 的失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多