行为模拟中的未定义数据包(verilog)

行为模拟中的未定义数据包(verilog),verilog,Verilog,我已经在这个代码上工作了一个多星期了,现在有一个问题我还没有解决。基本上我制作了两种数据模式,一种是T_数据,另一种是RX_数据。我正在比较两种模式,并在比较后以总误差的形式得到一个结果 这是密码 `timescale 1ns / 1ps module BER ( clk, rstn, T_Data, RX_Data, enable, total_error ); input clk; input rstn; input [15:0] T_Data; input [15:0] RX_Dat

我已经在这个代码上工作了一个多星期了,现在有一个问题我还没有解决。基本上我制作了两种数据模式,一种是T_数据,另一种是RX_数据。我正在比较两种模式,并在比较后以总误差的形式得到一个结果

这是密码

`timescale 1ns / 1ps

module BER
(
clk,
rstn, 
T_Data,
RX_Data,
enable,
total_error
);

input clk;
input rstn;
input [15:0] T_Data;
input [15:0] RX_Data;
input enable;

output [15:0] total_error;


reg [4:0] i;
reg [15:0] subtotal, next_subtotal;

assign total_error = subtotal;

always @ (posedge clk) begin: comb
    next_subtotal = 0;
    for (i = 0; i < 16; i = i +1) 
    begin
        if (T_Data[i] != RX_Data[i]) 
        begin
            next_subtotal = next_subtotal + 1;
        end
    end
end

always @ (posedge clk) begin: dff
    if (rstn == 1'b0) begin
        subtotal <= 16'b0000000000000000;
    end else 
    begin
        subtotal <= next_subtotal;
    end
end
endmodule
我正在使用VIVADO 2014.3软件。 在运行bhavioral模拟之后,它从0ns开始,我让它运行50ns。在此期间,数据传输发生,T_数据和RX_数据为16位数据。因此,传输从0到15进行。我希望每个数据位都有一个值,但我看不到。我只在16位数据传输完成后看到T_数据和RX_数据的最终值。在整个传输过程中,两个数据都未定义为红色,具有值X。但在16位之后,当过程完成时,我可以看到最终的数据值。 奇怪的是在数据传输过程中,尽管它们没有定义,但我可以看到total_error的值在变化,这意味着这些未定义的数据中有一些值。我真的不明白如何解决这个问题。我需要帮助


请帮我解决这个问题,我是verilog新手,我自己还没能弄清楚。

在模拟过程中看到红色X的原因是,在模拟开始时,您从未初始化
T\u Data
RX\u Data
的值。由于这些被声明为
reg[15:0]
,它们将以
16'bXXXX
的值开始(即,所有位
1'bx
表示不关心)。Verilog中的许多数据类型都处于该状态,以说明系统在开始时的未知状态。在模拟开始时,需要将所有输入设置为某个默认值(可能为0),以便将它们添加到刺激初始块的开始处:

//-----------------------//       
initial begin
  // Set all inputs to 0
  T_data = 16'b0;
  RX_data = 16'b0;
  T_Valid = 1'b0;
  RX_Valid = 1'b0;
  RX_Active = 1'b0;

  #100
  execute_in = 0;
  ...
这将有助于澄清你的错误。但是,由于您是Verilog新手,您还需要修复一些其他错误:

您的组合逻辑在时钟触发,当任何“输入”信号改变时,它们都应该被触发,因此使用阻塞分配的代码中的任何始终阻塞
=
应该是
始终(*)
而不是
始终@(posedge clk)
例如确定
T\u Ready
next\u小计的块。
小计
sel
块正确使用
always@(posedge clk)

对于组合逻辑确定
T\u ready
,并非所有
sel
的值都确定
T\u ready
。例如,
T_ready
be应该是
sel
is 7'd3?您需要确保为输入的所有值定义了由组合逻辑确定的任何值


由于并非所有触发器都是异步复位的,因此需要确保在复位开始时运行时钟。初始重置和计时的初始块无法完成此操作。

非常感谢您的帮助。最后几行,你提到的不是我所有的触发器都是异步复位的,你能给我参考一下你看到的是哪一个块吗?哪个初始块用于初始重置?再一次,非常感谢much@Sultan
BER
模块中标记为
dff
的块具有同步复位,因为
resetn
不在灵敏度列表中。如果希望它是异步重置,则需要像在状态机模块中一样添加
negedge resetn
。我所指的初始块是测试台上第一个进行计时的块(从
clk=1'b0;
开始);如果要同步重置,则需要在断言
resetn
时运行时钟(通常通过在不同的初始块中设置重置和时钟)。
`timescale 1ns / 1ps
module TB_BER();

//inputs
reg clk;
reg resetn;
reg execute_in;
//-----------------------//
//inputs for trasnferring signals
reg [15:0] T_Data;
reg T_Valid;
//-----------------------//
//inputs for receiving signals
reg [15:0] RX_Data;
reg RX_Active;
reg RX_Valid;
//-----------------------//
//outputs
wire [15:0] total_error;
wire T_Ready;
//-----------------------//
//instantiate the unit under test (UUT)
StateMachine_BER uut_BER
(
.clk(clk),
.resetn(resetn), //negetive edge reset
.T_Data(T_Data),
.T_Valid(T_Valid),
.T_Ready(T_Ready),
.RX_Data(RX_Data),
.RX_Active(RX_Active),
.RX_Valid(RX_Valid),
.total_error(total_error)
);
//-----------------------//
initial begin
            clk = 1'b0;
            resetn = 1'b0;
            #50
            resetn = 1'b1;
            forever #10 clk = ~clk;
        end
//-----------------------//       
initial begin
            #100
            execute_in = 0;
            #100
            execute_in = 1;
//-----------------------//
            #100
            T_Valid = 1'b0;
            RX_Active = 1'b0;
            #100
            RX_Valid = 1'b0;
//-----------------------//  
// for T_Data: 0 and RX_Data: 0     
            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[0] = 1'b1; //data 0 //make it 0 for getting an error
            RX_Valid = 1'b1;
            RX_Data[0] = 1'b1; //data 0 //make it 0 for getting an error
            #50
            T_Valid = 1'b0;       
//-----------------------//
// for T_Data: 1 and RX_Data: 1    
            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[1] = 1'b1; //data 1 //make it 0 for getting an error
            RX_Valid = 1'b1;
            RX_Data[1] = 1'b1; //data 1 //make it 0 for getting an error
            #50
            T_Valid = 1'b0;    
            //-----------------------//           
// for T_Data: 2 and RX_Data: 2     
            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[2] = 1'b1; //data 2 //make it 0 for getting an error
            RX_Valid = 1'b1;
            RX_Data[2] = 1'b1; //data 2 //make it 0 for getting an error
            #50
            T_Valid = 1'b0;    
            //-----------------------//
// for T_Data: 3 and RX_Data: 3    
            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[3] = 1'b1; //data 3 //make it 0 for getting an error
            RX_Valid = 1'b1;
            RX_Data[3] = 1'b1; //data 3 //make it 0 for getting an error
            #50
            T_Valid = 1'b0;    
            //-----------------------//  
// for T_Data: 4 and RX_Data: 4    
            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[4] = 1'b1; //data 4 //make it 0 for getting an error
            RX_Valid = 1'b1;
            RX_Data[4] = 1'b1; //data 4 //make it 0 for getting an error
            #50
            T_Valid = 1'b0;       
            //-----------------------//
// for T_Data: 5 and RX_Data: 5    
            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[5] = 1'b1; //data 5 //make it 0 for getting an error
            RX_Valid = 1'b1;
            RX_Data[5] = 1'b1; //data 5 //make it 0 for getting an error
            #50
            T_Valid = 1'b0;    
            //-----------------------//           
// for T_Data: 6 and RX_Data: 6   
            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[6] = 1'b1; //data 6 //make it 0 for getting an error
            RX_Valid = 1'b1;
            RX_Data[6] = 1'b1; //data 6 //make it 0 for getting an error
            #50
            T_Valid = 1'b0;    
            //-----------------------//
// for T_Data: 7 and RX_Data: 7   
            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[7] = 1'b1; //data 7 //make it 0 for getting an error
            RX_Valid = 1'b1;
            RX_Data[7] = 1'b1; //data 7 //make it 0 for getting an error
            #50
            T_Valid = 1'b0;  
            //-----------------------//
// for T_Data: 8 and RX_Data: 8    
             #100
             RX_Active = 1'b1;
             T_Valid = 1'b1;
             T_Data[8] = 1'b0; //data 8 //make it 0 for getting an error
             RX_Valid = 1'b1;
             RX_Data[8] = 1'b1; //data 8 //make it 0 for getting an error
             #50
             T_Valid = 1'b0;       
             //-----------------------//
// for T_Data: 9 and RX_Data: 9    
             #100
             RX_Active = 1'b1;
             T_Valid = 1'b1;
             T_Data[9] = 1'b1; //data 9 //make it 0 for getting an error
             RX_Valid = 1'b1;
             RX_Data[9] = 1'b0; //data 9 //make it 0 for getting an error
             #50
             T_Valid = 1'b0;    
             //-----------------------//           
// for T_Data: 10 and RX_Data: 10     
             #100
             RX_Active = 1'b1;
             T_Valid = 1'b1;
             T_Data[10] = 1'b0; //data 10 //make it 0 for getting an error
             RX_Valid = 1'b1;
             RX_Data[10] = 1'b1; //data 10 //make it 0 for getting an error
             #50
             T_Valid = 1'b0;    
             //-----------------------//
// for T_Data: 11 and RX_Data: 11   
             #100
             RX_Active = 1'b1;
             T_Valid = 1'b1;
             T_Data[11] = 1'b1; //data 11 //make it 0 for getting an error
             RX_Valid = 1'b1;
             RX_Data[11] = 1'b0; //data 11 //make it 0 for getting an error
             #50
             T_Valid = 1'b0;    
             //-----------------------//  
// for T_Data: 12 and RX_Data: 12    
             #100
             RX_Active = 1'b1;
             T_Valid = 1'b1;
             T_Data[12] = 1'b1; //data 12 //make it 0 for getting an error
             RX_Valid = 1'b1;
             RX_Data[12] = 1'b0; //data 12 //make it 0 for getting an error
             #50
             T_Valid = 1'b0;       
             //-----------------------//
// for T_Data: 13 and RX_Data: 13    
             #100
             RX_Active = 1'b1;
             T_Valid = 1'b1;
             T_Data[13] = 1'b0; //data 13 //make it 0 for getting an error
             RX_Valid = 1'b1;
             RX_Data[13] = 1'b1; //data 13 //make it 0 for getting an error
             #50
             T_Valid = 1'b0;    
             //-----------------------//           
// for T_Data: 14 and RX_Data: 14  
             #100
             RX_Active = 1'b1;
             T_Valid = 1'b1;
             T_Data[14] = 1'b0; //data 14 //make it 0 for getting an error
             RX_Valid = 1'b1;
             RX_Data[14] = 1'b1; //data 14 //make it 0 for getting an error
             #50
             T_Valid = 1'b0;    
             //-----------------------//           
// for T_Data: 15 and RX_Data: 15   
             #100
             RX_Active = 1'b1;
             T_Valid = 1'b1;
             T_Data[15] = 1'b1; //data 15 //make it 0 for getting an error
             RX_Valid = 1'b1;
             RX_Data[15] = 1'b0; //data 15 //make it 0 for getting an error
             #50
             T_Valid = 1'b0;  
        end
endmodule
//-----------------------//       
initial begin
  // Set all inputs to 0
  T_data = 16'b0;
  RX_data = 16'b0;
  T_Valid = 1'b0;
  RX_Valid = 1'b0;
  RX_Active = 1'b0;

  #100
  execute_in = 0;
  ...