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并没有错但是误导了。
目前,为了一个想法,我开始用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并没有错但是误导了。