Verilog中两个变量之间的逐位比较

Bit by bit comparison between two variables in Verilog

目前,为了一个想法,我开始用Verilog写固件。它是将两个变量逐位比较,然后用一个二进制计数器来计算不同位的个数。

例如:

我在verilog中有两个变量

A : 8'b00100001;

B : 8'b01000000;

然后我给出条件在两个变量之间逐位比较。如果 A 的 1 位和 B 的 1 位在相同的位位置不同,则二进制计数器计数。

这是我的verilog代码:

module BERT_test(
  input CLK,
  input RST,
  input [7:0] SIG_IN,
  input [7:0] SIG_OUT,
  output [7:0] NUM_ERR
);
  integer i;
  reg[7:0] sign_in;
  reg[7:0] sign_out;

  always @(posedge CLK) begin
    sign_in[7:0] <= SIG_IN[7:0];
    sign_out[7:0] <= SIG_OUT[7:0];
  end

  reg [15:0] bit_err; 

  // Combinational Logic
  always @* begin
    bit_err = 8'b0;
    for (i=0;i<8;i=i+1) begin
      if (sign_in[i] == sign_out[i]) begin
        bit_err = bit_err + 8'b0;
      end else begin
        bit_err = bit_err + 8'b1;
      end
    end
    assign NUM_ERR = bit_err;
  end
endmodule 

那我错了

Reference to vector wire 'NUM_ERR' is not a legal reg or variable lvalue

我不知道如何解决这个问题。这个问题有什么解决办法或者我需要怎么修改我的固件,请给我建议。

您正在从 always 块中驱动 NUM_ERR(网络)。不允许从 always 块(或初始块)驱动网络。您需要移动此行:

assign NUM_ERR = bit_err;

在 always 块之外。

您不应在 always 块内使用 assign 语句。这是合法的,但已被弃用并且意味着一些奇怪的事情。如果您错误地将这一行包含在 always 块中,那么正确缩进您的代码就会显示出来。

您在 always 块中有一个赋值。把它移到外面。

如果位相同,则将位错误加零是多余的。

if (sign_in[i] != sign_out[i]) 
  bit_err = bit_err + 8'b1;

另外位错误是16位所以加8'b1并没有错但是误导了。