门级Verilog和行为Verilog可以混合使用吗?

时间:2019-07-15 14:42:23

标签: verilog

我一直在研究一个非常简单的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

1 个答案:

答案 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