Verilog中两个变量的逐位比较

Verilog中两个变量的逐位比较,verilog,xilinx,Verilog,Xilinx,目前,为了一个想法,我开始用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, inpu

目前,为了一个想法,我开始用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 
模块BERT\u测试(
输入时钟,
输入RST,
输入[7:0]信号输入,
输入[7:0]信号输出,
输出[7:0]个错误
);
整数i;
注册[7:0]登录;
注册[7:0]注销;
始终@(posedge CLK)开始

登录[7:0]您正在从always块驾驶
NUM\u ERR
(网络)。不允许从始终块(或初始块)驱动网络。您需要移动此行:

assign NUM_ERR = bit_err;
总是在街区外


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

您正在从always块驱动
NUM\u ERR
(一个网络)。不允许从始终块(或初始块)驱动网络。您需要移动此行:

assign NUM_ERR = bit_err;
总是在街区外


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

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

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

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

此外,位错误为16位,因此添加8'b1并不错误,但会产生误导。

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

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

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

此外,位错误为16位,因此添加8'b1并没有错,但会产生误导。

您说过您选择verilog进行位比较。我没听错吧?FYI,你可以用其他任何语言来做,C,C++,java,python,perl,……你说你选择了verilog进行位比较。我没听错吧?FYI,你可以用其他任何语言来做,C,C++,java,python,perl,…