我在 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
如何让第一个模块也等待?这怎么可能?
提前致谢!
要在第一阶段获得同步行为,请将激励应用于第一阶段,以便在其输入处对同步行为进行建模。
像这样。
initial begin
@(posedge clk);
left <= 1;
#11;
$finish;
end