【发布时间】:2015-04-10 22:40:04
【问题描述】:
我只知道 Verilog 2 个月,最多 3 个月。我对这件事感到非常沮丧,如果它发生在我所知道的其他非 HD 语言中,我将其称为 竞态条件。以下是描述案例的最简化形式的文件:
circuit.v
module circuit(f, x, clk, rst);
output f;
input x, clk, rst;
wire d, q;
d_flip_flop flipper (q, d, clk, rst);
assign f = q;
assign d = x;
endmodule
d_flip_flop.v
module d_flip_flop(q, d, clk, rst);
output reg q;
input d, clk, rst;
always @(posedge clk, posedge rst)
begin
if (rst)
q <= 1'b0;
else
q <= d;
end
endmodule
我用这个tester.v测试这些
module tester;
reg x, clk, rst;
wire f;
circuit uut (f, x, clk, rst);
initial clk <= 0;
always #10 clk <= ~clk;
initial
begin
x <= 0;
rst <= 0;
rst <= #2 1;
rst <= #4 0;
#10 x <= 1;
end
endmodule
这是我得到的波形:
我从该波形中看到的是 Verilog 已决定它应该首先处理 clk 中的更改,因此执行 q <= d;;然后才处理x中的更改,因此执行assign d = x;。
我所说的可能在硬件中甚至没有意义,但无论如何。
现在:我周围有一些人,所谓的讲座助理,更有经验,可能更博学,声称正确编写的 Verilog 顺序模块总是认为发生了变化,因为时钟敲响了。然而,即使在这个极其简单的例子中,我也认为情况并非如此(可能也不一定)。
所以,问题是,我应该怎么做才能把它变成一个正确编写 Verilog 顺序模块?我怎样才能让我的坏代码像其他代码一样好?还是根本没有这样的事情,而 Verilog 在这种情况下只是自豪地是非确定性的?
【问题讨论】:
-
在顶级模块中不要使用
d_flip_flop flipper (q, d, clk, rst);,而是使用d_flip_flop flipper (q, x, clk, rst);。
标签: verilog race-condition simultaneous