![](/img/trans.png)
[英]Verilog error: Register is illegal in left-hand side of continuous assignment
[英]Why is wire variable causing illegal left-hand side in continuous assignment?
我已經閱讀了所有類似的帖子,但是都沒有解決我遇到的問題,即第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
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是一種硬件描述語言 。 常規的數字硬件無法根據其輸入狀態重新配置自身。
問題是您正在執行連續作業。 引用IEEE Std 1800-2012。 (第10.3節)關於連續作業:
連續分配應將值驅動到矢量(打包的)和標量的網絡或變量上。 只要右側的值發生變化,就應進行此分配。 連續分配提供了一種在不指定門互連的情況下對組合邏輯建模的方法。
當您確實assign Y[b]=~Y[b]
,分配本身會自動導致右側再次更改,從而再次觸發分配。
Verilog標准列出了連續分配的合法lhs值,如下所示(表10-1):
凈或變量(向量或標量)
向量網絡或壓縮變量的恆定位選擇
向量網絡或壓縮變量的恆定部分選擇
上述任何左側的串聯或嵌套串聯
在您的情況下, Y[b]
不是常數選擇,因為b
不是常數。 因此,從語法上講,您的lhs是非法的,並且您從編譯器獲得此消息。
附帶說明一下,這里有一個零延遲循環。 請參閱其他答案以獲取解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.