目前,我开始用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'的引用不是合法的注册或变量左值
我不知道如何解决这个问题。有没有解决这个问题的方法或我需要修改我的固件,请建议我。
答案 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但误导性并没有错。