为何输入型reg变量不允许进行连续赋值?
Verilog中reg型变量连续赋值的报错原因解析
现象对比
- 模块内部声明的reg变量,使用
assign连续赋值可正常编译运行:
module test_1; reg as; assign as = 0; endmodule
- 若将reg变量声明为
input端口后再用assign赋值,会触发编译错误:
ERROR VCP2979 "Variable ""as"" has more than one continuous driver."
对应的错误代码示例:
module test_2( input reg as ); assign as = 0; endmodule
报错原因
- 内部reg变量的驱动逻辑:模块内单独声明的reg变量,默认不存在其他驱动源,
assign语句是它的唯一连续驱动,因此语法合法(注:虽然reg变量通常用always等过程块赋值更符合Verilog语义,但语法上允许用连续赋值将其当作wire类型驱动)。 - input reg端口的驱动冲突:
input reg as的写法是将端口声明为reg类型,这个端口的驱动源来自模块外部的输入信号。此时在模块内部用assign再给它赋值,相当于给变量as添加了第二个连续驱动源(外部输入+内部assign),违反了Verilog中「变量不能同时拥有多个连续驱动」的规则,因此编译器抛出错误。
解决方法
如果需要在模块内部操作类似的变量,不要直接将reg声明为input端口,而是声明内部reg变量,再根据需求处理:
module test_2( input as_in // 外部输入端口 ); reg as; assign as = 0; // 对内部reg变量进行连续赋值 // 或者用过程赋值: // always @(*) begin // as = 0; // end endmodule
内容的提问来源于stack exchange,提问作者gubang
相关产品推荐
相关产品推荐

