为什么在这个Verilog函数中没有赋值语句?

时间:2011-02-25 20:57:07

标签: verilog

来自C ++背景我开始学习Verilog。此代码描述了进入两个AND门的四个输入。这两个AND门的输出进入OR门。或门的输出是最终输出。

// a user-defined AND gate
module my_and2 (in, out);
input [1:0] in;
output out;
assign out = in[1]&in[0];
endmodule

// a user-defined OR gate
module my_or2 (in, out);
input [1:0] in;
output out;
assign out = in[1]|in[0];
endmodule

// the AND-OR logic built on top of the user-defined AND and OR gates
module and_or (in_top, out_top);
input [3:0] in_top;
output out_top;
wire [1:0] sig;
// instantiate the gate-level modules
my_and2 U1 (.in(in_top[3:2]),.out(sig[1]));
my_and2 U2 (.in(in_top[1:0]),.out(sig[0]));
my_or2 U3 (.in(sig),.out(out_top));
endmodule

前两个模块对我有意义。但是,最后一个没有。前两个模块在末尾有一个assign语句来设置输出变量的值。但是,最后一个没有。那是为什么?

3 个答案:

答案 0 :(得分:4)

Verilog是'事件驱动'。在编写verilog时,请考虑敏感性列表。

在AND门的示例中,您使用了表达式assign out = in[1]&in[0];。据说您的表达对in[0]in[1]很敏感。这意味着,只要in[0]in[1]更改,表达式就会重新计算,out的值将会更新。

因此,在你的顶层模块and_or中,你基本上构建了一个对前面表达式的输出敏感的大型表达式树。当然,这棵树是使用模块连接构建的。因此,这个顶层模块的一个输入值的变化将会波及其“逻辑锥”中的所有表达式。

要驱动输入,您需要更高级别的测试平台模块驱动信号进入and_or模块。这将提供时间间隔的输入,这将触发and_or内和下方的表达式。如果没有,你的SIM卡将没有任何事件,因此不会触发任何表达式,并且sim会因为“事件缺乏”而在0ps超时。

PS:对于你的AND门表达式,assign out = ∈也可以...(减少AND运算符)

答案 1 :(得分:2)

out_top由U3实例输出驱动。

答案 2 :(得分:1)

简单地说,我喜欢将实例化视为连接线。

模块是数字电路的模块。你和AND门模块是魔术发生的地方。你已经明白那部分了。通过实例化这些模块,就像您将顶层模块的输入线与两个块AND模块的输入连接起来一样。然后取出它们的输出并将它们贴在输出线上,从OR块中伸出。最后,您将OR块的输出连接到顶层的输出信号线。