Verilog编译报错concurrent assignment to a non-net问题排查求助
报错原因及代码修正方案
- 错误1:输入端口类型定义错误
Verilog语法规定,input端口默认必须为net类型(如wire),不能定义为reg类型。你将ex1模块的a、b输入端口定义为reg类型,外部例化时相当于对reg类型变量做连续驱动,直接触发concurrent assignment to a non-net报错。 - 错误2:assign连续赋值语句逻辑语法错误
assign语句是对左侧变量做连续赋值,你写的assign c=(a>b)?(a=1'b1):(c=1'b0);存在两个问题:一是在三目运算符内部给输入端口a赋值,输入端口只能读取不能改写;二是出现c自赋值的逻辑错误。 - 错误3:端口列表多余逗号
ex1模块的端口定义最后output wire c,多了一个尾逗号,属于语法瑕疵,部分编译器会直接判定为语法错误。
修正后的ex1模块代码
module ex1( input [1:0] a, // 去掉reg定义,input默认是wire类型 input [1:0] b, output wire c // 去掉多余尾逗号 ); // 仅对c做赋值,三目运算符直接返回对应值即可 assign c = (a > b) ? 1'b1 : 1'b0; endmodule
修正后的testbench代码
module testbench(); reg[1:0] a = 2'b11; reg [1:0] b = 2'b00; wire c; always #10 begin a = a - 2'b01; b = b - 2'b01; end initial #150 $finish; ex1 testbench2 ( .a(a), .b(b), .c(c) ); endmodule
内容的提问来源于stack exchange,提问作者qqwetrt8
相关产品推荐
相关产品推荐

