我一直在研究一个非常简单的Verilog示例。可以在门模块中使用阻塞表达式吗?
我不知道该模块中句子out=0;
是对还是错。这个模块会被模拟吗?
module what_is_it (in1, in2, in3, out);
output out;
input in1, in2, in3;
out = 0;
and a1(a1_o, in1, in3);
and a2(a2_o, in2, ~in3);
or o1(out, a1_o, a2_o);
endmodule
答案 0 :(得分:1)
此语法无效。即使您添加assign
关键字来消除可能的编译错误,out
也是不确定的。
让我们忽略out = 0
一秒钟。您可以将模块重写为
module what_is_it (in1, in2, in3, out);
output out;
input in1, in2, in3;
assign out = (in1 && in3) || (in2 && ~in3);
endmodule
使用这种表示,很明显,out
将被 连续 分配(Section 10.3, IEEE Std 1800-2012),并具有输入端口的逻辑组合。
在此之前添加(assign) out = 0
是没有意义的,因为您将不断从两个不同的源驱动相同的信号。
如果要进行阻塞分配,则应将逻辑包装在组合的Always阻塞中。请参见下面的示例。
module what_is_it (in1, in2, in3, out);
output reg out;
input in1, in2, in3;
always @(*) begin
out = 0;
out = (in1 && in3) || (in2 && ~in3);
end
endmodule