Verilog posege寄存器操作

问题描述 投票:0回答:1

我在 verilog 中偶然发现了一种不寻常的行为。我有这个非常简单的模块test

`timescale 1ns / 1ps

module test (
    input clk,
    input left,
    output right
);
    reg right_ = 0;
    assign right = right_;
    always @(posedge clk) begin
        right_ <= left;
    end
endmodule

它所做的就是将输入值传输到下一个posege的输出。

现在让我们看看我编写的测试平台并讨论它实际上在做什么!

在此测试平台中,我实例化了 2 个模块测试并将它们依次连接。对我来说奇怪的是,第一个模块似乎立即将其左侧的值转移到右侧,但是下一个模块耐心等待,仅在一个时钟周期后才执行以下操作。

`include "test.v"

`timescale 1ns / 1ps

module test_tb;

// Inputs
reg clk = 1;
reg left = 0;

// Outputs
wire right;
wire out;

// Clock gen
always  begin
    #1;
    clk = ~clk;
end

// Instantiate modules
test t1
(
    .clk(clk),
    .left(left),
    .right(right)
);

test t2
(
    .clk(clk),
    .left(right),
    .right(out)
);


initial begin
    $dumpfile(`VCD_FILE);
    $dumpvars(0, test_tb);
    #10;
    left = 1;
    #11;
    $finish;
end


endmodule

这里是 gtkWave 的屏幕截图,以获得更好的图片:

如何让第一个模块也等待?这怎么可能?

提前致谢!

verilog
1个回答
0
投票

要在第一阶段获得同步行为,请将激励应用于第一阶段,以便在其输入处对同步行为进行建模。
像这样。

initial begin
    @(posedge clk);
    left <= 1;
    #11;
    $finish;
end
© www.soinside.com 2019 - 2024. All rights reserved.