我已经阅读了所有类似的帖子,但是都没有解决我遇到的问题,即第41行assign Y[b]=~Y[b];
导致错误“连续分配中的左侧非法”。
我还没有分配任何注册表,所以我看不出问题是什么。如果我将b
替换为实际数字(例如3),则可以正常工作。但是我需要b
作为变量。
// Hamming code 1-bit error correction
module HCG(I,e,O);
input [4:1] I; // input BCD
input [7:1] e; // noise simulation
wire [7:1] X; // Hamming code
wire [7:1] Y; // Hamming code after addition of noise
wire [3:1] P; // Parity at start
wire [3:1] S; // Parity at end
wire b; // the error bit
output [4:1] O; // corrected output
assign X[1]=I[1]^I[2]^I[4]; // Hamming code generator
assign X[2]=I[1]^I[3]^I[4];
assign X[3]=I[1];
assign X[4]=I[2]^I[3]^I[4];
assign X[5]=I[2];
assign X[6]=I[3];
assign X[7]=I[4];
assign P[1]=X[1]; // Parity at start
assign P[2]=X[2];
assign P[3]=X[4];
assign Y[1]=e[1]^X[1]; // noise added
assign Y[2]=e[2]^X[2];
assign Y[3]=e[3]^X[3];
assign Y[4]=e[4]^X[4];
assign Y[5]=e[5]^X[5];
assign Y[6]=e[6]^X[6];
assign Y[7]=e[7]^X[7];
assign S[1]=Y[3]^Y[5]^Y[7]; // Parity at end
assign S[2]=Y[3]^Y[6]^Y[7];
assign S[3]=Y[5]^Y[6]^Y[7];
assign b=(S[1]!=P[1])? b:b+1; // if parity of 2^0 not the same, add 1 to b
assign b=(S[2]!=P[2])? b:b+2; // if parity of 2^1 not the same, add 2 to b
assign b=(S[3]!=P[3])? b:b+4; // if parity of 2^2 not the same, add 4 to b
assign Y[b]=~Y[b]; // correct the incorrect bit
assign O[1]=Y[3]; // assigning outputs
assign O[2]=Y[5];
assign O[3]=Y[6];
assign O[4]=Y[7];
endmodule
答案 0 :(得分:1)
module
和endmodule
之间的行一致地执行。 (似乎您认为它们是按顺序执行的。)因此,您正在驱动这些行中的Y
的所有位
assign Y[1]=e[1]^X[1]; // noise added
assign Y[2]=e[2]^X[2];
assign Y[3]=e[3]^X[3];
assign Y[4]=e[4]^X[4];
assign Y[5]=e[5]^X[5];
assign Y[6]=e[6]^X[6];
assign Y[7]=e[7]^X[7];
然后在这一行中再次驱动Y
的位之一:
assign Y[b]=~Y[b]; // correct the incorrect bit
那么(a)您发生短路,并且(b)哪一位发生短路?这取决于b
。因此,短路的位置取决于内部导线之一的状态。您已经描述了可以根据输入重新配置的电路。 Verilog不允许您这样做。 Verilog是一种硬件描述语言。常规的数字硬件无法根据其输入状态重新配置自身。
答案 1 :(得分:0)
问题是您正在执行连续作业。引用IEEE Std 1800-2012.(第10.3节)中的连续作业:
连续分配应将值驱动到矢量(打包的)和标量的网络或变量上。 只要右侧的值发生更改,就应进行此分配。 连续分配提供了一种对组合逻辑进行建模的方法,而无需指定门的互连。
执行assign Y[b]=~Y[b]
时,分配本身会自动使右侧再次发生变化,从而再次触发分配。
答案 2 :(得分:0)
Verilog标准列出了连续分配的合法lhs值,如下所示(表10-1):
在您的情况下,净值或变量(矢量或标量)
向量网络或压缩变量的恒定位选择
向量网络或压缩变量的恒定部分选择
任何上述左侧的串联或嵌套串联
Y[b]
不是常数选择,因为b
不是常数。因此,从语法上讲,您的lhs是非法的,您会从编译器获得此消息。
请注意,您这里有一个零延迟循环。请参阅其他答案以获取解释。