繁体   English   中英

为什么导线变量导致连续分配中的非法左侧?

[英]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

moduleendmodule之间的行是并发执行的。 (似乎您认为它们是按顺序执行的。)因此,您正在驱动这些行中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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM