Verilog

时间:2018-03-12 07:53:21

标签: verilog xilinx

目前,我开始用Verilog编写固件来实现一个想法。它在两个变量之间逐位进行比较,然后使用一个二进制计数器来计算不同位的数量。

例如:

我在verilog中有两个变量

答:8'b0 01 0000 1 ;

B:8'b0 10 0000 0 ;

然后我给出了两个变量之间逐位比较的条件。如果在相同的位位置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 

然后我有一个错误

  

对矢量线'NUM_ERR'的引用不是合法的注册或变量左值

我不知道如何解决这个问题。有没有解决这个问题的方法或我需要修改我的固件,请建议我。

2 个答案:

答案 0 :(得分:2)

您正在驾驶NUM_ERR(网)从始终阻止。不允许从始终块(或初始块)驱动网络。你需要移动这一行:

assign NUM_ERR = bit_err;
总是阻挡外面的

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

答案 1 :(得分:1)

你有一个始终阻止的WITHIN。把它移到外面。

如果位相同则添加零到位错误是多余的。

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

此外,位错误是16位,因此添加8&b; b1但误导性并没有错。