Verilog编译报错(vlog-2110):非法引用net "code"问题如何解决?
Verilog格雷码计数器报错排查
报错信息
gray_counter\gray_counter.v(2): (vlog-2110) Illegal reference to net "code"
报错根本原因
Verilog语法规定,input端口默认是wire(线网)类型,线网类型不允许在端口声明时直接赋值初始值。你在声明input [2:0]code=3'b000;时直接给input端口赋了初始值,属于非法的线网引用,所以触发了该报错。
另外你的代码还存在几个逻辑问题:
- 二进制转格雷码的逻辑写反,现有写法是格雷码转二进制的逻辑
- 时序逻辑块中使用了阻塞赋值
=,可能导致仿真与实际电路行为不一致 count只有1位位宽,多次累加会直接溢出,无法实现计数功能- case分支所有情况逻辑完全一致,属于冗余代码
解决方法
- 首先删除input端口code的初始值赋值,即可解决2110报错,修改后端口声明为
input [2:0]code; - 可选优化(解决其余逻辑问题):
- 调整count的位宽为3位,满足0~7的计数需求
- 时序逻辑赋值改用非阻塞赋值
<= - 修正二进制转格雷码的逻辑
- 删除冗余的case语句
修改后完整代码
module gray_counter( input [2:0] code, input clk, input rst, output reg [2:0] count ); reg [2:0] conv_code; always@(posedge clk , posedge rst) begin if(rst) begin count <= 0; end else begin // 二进制转格雷码正确逻辑 conv_code = {code[2], code[2]^code[1], code[1]^code[0]}; // 所有格雷码值都执行计数,无需case分支 count <= count + 1; end end endmodule
内容的提问来源于stack exchange,提问作者kaviyarasu s
相关产品推荐
相关产品推荐

