首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >行为模拟中的未定义数据包(verilog)

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

Stack Overflow用户
提问于 2014-11-18 14:35:03
回答 1查看 460关注 0票数 1

从现在开始,我一直在研究这个代码,有一个问题我一直无法解决。基本上,我正在创建两个数据模式,一个是T_DATA,另一个是RX_Data。我正在比较这两种模式,并在以total_error的形式进行比较之后得到了一个结果。

这是代码

代码语言:javascript
复制
`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

以上是ber模块的代码,在下一个模块中,我制作了状态机,基本上控制传输和接收信号。上面的模块误码率已经用StateMachine_BER模块实例化了。请看下面的代码

代码语言:javascript
复制
`timescale 1ns / 1ps
module StateMachine_BER
(
clk,
resetn, //negetive edge reset
T_Data [15:0],
T_Valid,
T_Ready,
RX_Data [15:0],
RX_Active,
RX_Valid,
total_error
);

//-----------------------//
input clk;
input resetn;
//-----------------------//

//declaring input and output for transferring signals
input [15:0] T_Data;
input T_Valid;
output T_Ready;

//declaring inputs and outputs for receiving signals
input [15:0] RX_Data;
input RX_Active;
input RX_Valid;

//-----------------------//
output [15:0] total_error;
//-----------------------//

//declaring registers to use them for procedural assignments
//-----------------------//
reg [6:0] sel;
reg execute_in;
reg T_Ready;
//-----------------------//

//instantiating ber module here
BER uut
(
.clk(clk),
.rstn(resetn), 
.T_Data(T_Data),
.RX_Data(RX_Data),
.enable(execute_in),
.total_error(total_error)
);
//-----------------------//

//making state machine here
always @ (posedge clk or negedge resetn)
begin
    if (resetn == 1'b0) //idle state
    begin
        sel <= 7'b0000000;  //state 0
    end
    else if (T_Valid == 7'b0000001)
    begin
        sel <= 7'b0000001;  //state 1
    end
    else if (sel == 7'b0000001)
    begin
        sel <= 7'b0000010;  //state 2
    end
    else if (RX_Active == 7'b0000001)
    begin
        sel <= 7'b0000011;  //state 3
    end
    else if (T_Valid == 7'b0000001 && RX_Valid == 7'b0000001)
    begin
        sel <= 7'b0000100;  //state 4
    end
    else if (sel == 7'b0000100)
    begin
        sel <= 7'b0000101;  //state 5
    end
    else if (T_Valid == 7'b0000000 && RX_Valid == 7'b0000000)
    begin
        sel <= 7'b0000100;  //goes back to state 4
    end
end

//making outputs for state machine
always @ (posedge clk)
begin
    case(sel)
        7'b0000000 :
            execute_in = 1'b0;  //state 0
        7'b0000001 :
            T_Ready =    1'b1;  //state 1
        7'b0000010 :
            T_Ready =    1'b0;  //state 2
        7'b0000011 :
            execute_in = 1'b1;  //state 3
        7'b0000100 :
            T_Ready =    1'b1;  //state 4
        7'b0000101 :
            T_Ready =    1'b0;  //state 5
    endcase
end
endmodule

以下是上述模块的测试平台。

代码语言:javascript
复制
`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

我正在使用VIVADO 2014.3软件。运行模拟后,从0 ns开始,保持50 ns运行。在此过程中,进行数据传输,T_Data和RX_Data是16位数据。所以,传输是从0到15。我希望每个数据位都有一个值,但我看不到。在完成16位数据传输之后,我只看到T_Data和RX_Data的最终值。在整个传输过程中,这两个数据都是未定义的红色值X。但是在16位之后,当进程完成时,我可以看到最终的数据值。奇怪的是,在数据传输期间,即使它们是未定义的,但我可以看到total_error上的值正在变化,这意味着那些未定义的数据中有一些值。我真的不明白如何解决这个问题。需要帮助。

请帮助我,我是新来的,我还没能自己弄清楚。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-18 16:19:05

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

代码语言:javascript
复制
//-----------------------//       
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还不熟悉,您还需要修复一些其他错误:

组合逻辑是在时钟触发的,在任何时候任何“输入”信号发生变化时都应该触发它们,所以代码中任何使用阻塞赋值=的块都应该是always @(*)而不是always @(posedge clk),例如决定T_Readynext_subtotal的块。subtotalsel块正确地使用always @(posedge clk)

对于确定T_ready的组合逻辑,T_ready的值并不是为sel的所有值确定的。例如,T_ready应该是什么?sel是7'd3吗?您需要确保为输入的所有值定义由组合逻辑确定的任何值。

由于并不是所有的触发器都是异步复位的,因此您需要确保在开始断言重置时运行时钟。用于初始重置和时钟的初始块不会这样做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26996806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档