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

门级verilog和行为verilog可以混合使用吗?,verilog,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 此语法无

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

此语法无效。即使添加
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
将通过输入端口的逻辑组合连续地分配()

在此之前添加
(assign)out=0
是没有意义的,因为您将从两个不同的源连续驱动相同的信号

如果您想要一个分块赋值,您应该将您的逻辑包装在一个组合始终块中。请参见下面的示例

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

正确的verilog(门或非门)将
assign out=0非常感谢您的回答。据我所知,当传输数据的过程不连续时,即代码不在始终循环中时,我必须使用assign。如果有一个带有某些条件的always循环,我应该使用reg。我是对还是错?谢谢你的帮助。当传输数据的过程连续时,应使用
assign
。此外,您不应将
始终@(*)
视为传统循环。翻译过来,这意味着“如果任务右侧的任何内容发生变化,请始终执行”
reg
wire
在Verilog中可能有点混乱。如果要在always块内分配变量,应使用
reg
,是。