来自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语句来设置输出变量的值。但是,最后一个没有。那是为什么?
答案 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块的输出连接到顶层的输出信号线。