【发布时间】:2017-03-02 14:07:47
【问题描述】:
这是一个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
代码中有两个时钟:第一个是由时间生成的传统时钟always #5 第二个是由这个时钟生成的always @ clk_at_time 这两个时钟总是相等的(如预期的那样)
奇怪的是,如果我在 clk_at_time 的块中使用 clk_from_clk,之前的值将被使用 clk_from_clk。 (好的),但是如果我在 clk_from_clk 的块中使用 clk_at_time,则新值将用于 clk_at_time。
编辑
澄清:
查看波形:clk_from_clk 和 clk_at_time 始终相等。
见代码:r3 和 r4 是模拟的:
-
r3在clk_at_time的块中,由clk_from_clk驱动 -
r4在clk_from_clk的块中,由clk_at_time驱动
所以如果clk_from_clk 和clk_at_time 真的相同,r3 和r4 应该总是相等的。但请看波形:r3 始终为 0,r4 始终为 1
怎么样?规则是什么?
【问题讨论】:
-
奇怪的是,如果我在 clk_at_time 的块中使用 clk_from_clk,之前的值将被 clk_from_clk 使用。 (好的),但是如果我在 clk_from_clk 的块中使用 clk_at_time,那么新值将用于 clk_at_time。 什么?你是说用
always @(posedge clk_at_time)代替always @(posedge clk_from_clk)吗?请您编辑您的问题以使其更清楚吗? -
你能把你的问题说得更清楚吗?还要更改
clk_from_clk和clk_at_time的名称,因为它们彼此非常混淆。 -
我在Electronics StackExchange 回答了您同样的问题。通常建议通知 StackExchange 网络内的交叉帖子。