哪个值将用于始终块?

时间:2017-03-01 09:05:31

标签: verilog hdl

这是一个verilog代码:(此代码不用于综合)

`timescale 1 ns / 1 ns

module test;
    reg r1, r2, r3, r4;
    reg clk_at_time, clk_from_clk;


    // Initialize signals 
    initial begin
      r1 <= 1;
      r2 <= 0;
      clk_at_time <= 1;
      #200
      $finish();
    end


    // Generating simple a clock (period time is 10ns)  (as expected)
    always #5
        clk_at_time <= ~clk_at_time;


    // Generating a clock based on the clk_at_time.
    // This clk_from_clk is always equals the clk_at_time (as expected)
    always @ clk_at_time
        clk_from_clk <= clk_at_time;


    // r1 and r2 inverted at all posedge event. (as expected)
    // r3 is constant 0 (as expected)
    always @(posedge clk_at_time) begin
        r1 <= r2;
        r2 <= r1;
        r3 <= clk_from_clk;
    end


    // r4 is constant 1  ???!!!??? HOW ???!!!???
    always @(posedge clk_from_clk) begin
        r4 <= clk_at_time;
    end

endmodule

模拟的波形: The waveform of the simulation

在代码中有两个时钟:第一个是由时间always #5生成的传统时钟,第二个是由此时钟生成的always @ clk_at_time两个时钟总是相等(如预期的那样)

奇怪的是,如果我在clk_at_time&block; s块中使用clk_from_clk,那么前一个值将用于clk_from_clk。 (好),但是如果我在clk_from_clk块中使用clk_at_time,那么将使用clk_at_time的新值。

修改

澄清: 请参阅波形:clk_from_clkclk_at_time始终等于。

请参阅代码:r3r4是模拟的:

  • r3位于clk_at_time块中并由clk_from_clk
  • 驱动
  • r4位于clk_from_clk块中并由clk_at_time
  • 驱动

因此,如果clk_from_clkclk_at_time真的相同,r3r4应始终相等。但请参见波形:r3始终为0,r4始终为1

怎么样?规则是什么?

1 个答案:

答案 0 :(得分:0)

我不知道确切的答案,但我想分享一个意见,从模拟的角度思考。我把它写成答案而不是评论,因为它不适合评论。

我认为这与模拟的有限元分析性质有关。在模拟的每个时间步骤,模拟器逐个组件地解决电路。由于你的clk_from_clk是从clk_at_time导出的,因此模拟器将始终首先评估后者。

r4之后评估clk_from_clk,因此它的值始终为1.至于r3,它将在clk_at_time的同时进行评估并同时进行评估使用clk_from_clk并具有以前的值。