TestBench 之初见

                    使用Modism 单独仿真时,需要注意的几点

    1、对要仿真的文件(以 uart_rx 为例),先建立testbench 命名为tb_uart_rx ;//tb 说明是testbench文件。

    建立testbench  :module tb_uart_rx();//括号里没有参数

    2、在testbench 中的定义变量 类型:  但凡 在待仿真模块中定义为 输入变量,在testbench中则定义为 reg 类型。在待仿真模块中 定义为输出变量时,在testbench中 都定义为wire类型;

    3、在testbench中定义时钟信号的了三种基本方式

        3.1  always # Times clk = ~clk ;//Times 为周期的一半;

        3.2 //Times 为时钟周期的一半

           always 

                begin

                    #Times  clk = 0;

                    #Times   clk = 1;

               end

     3.3 forever  必须定义在initial语句内

            initial

                begin

                    forever # Times  clk = ~clk;

                end

4、task 的使用

   定义形式:

        task <任务名>(端口类型(和定义module中一样));

        <语句一>

        <语句二>......

        endtask

例如:

    task tx_bit(input [7:0]  );

    integer i;

    for( i = 0;i< 10;i=i+1)begin

    case(i) 

        0: tx <= 1'b1;.............

    endcase

    #560;//the delay is necessary 

  end

endtask 

5、例化  待仿真的文件  

  在testbench中通过例化与 待仿真的模块  建立一个完整的映射关系;


//=================================================

//**************************  下面是一个具体的testbench   *************************

//=================================================

 `timescale 1ns/1ns  //定义 仿真的周期  以及 仿真的时间的精度 

module tb_uart_rx; //  testbench名
reg clk ;  //在待仿真文件中的输入变量,定义为reg类型
reg rst_n;
reg tx ;


wire po_flag; //在待仿真中的输出变量,定义为wire类型
wire [7:0]rx_data;


reg [7:0] mem_a[3:0]; //定义一个存储器 ,存储宽度为8个bit,存储深度为4


initial //初始化 时钟和复位信号

    begin

clk = 1;
rst_n <= 0;
tx <= 1;
#100
rst_n <= 1;
#100
tx_byte() ;//执行任务 ,即模拟PC的串口发送模块把 数据给 接收模块
    end


//外部写一个Txt文件,generate a test wave
always #5 clk = ~clk;//定义并产生一个周期为10ns的时钟信号
initial $readmemh("./tx_data.txt",mem_a); // 将test 文本中的数据读入到存储器men_a中


task tx_byte();
integer i;
for(i = 0;i<4;i=i+1) begin
tx_bit(mem_a[i]);
end

endtask




task tx_bit(
input [7:0]data
);
integer i;
for(i = 0;i<10;i = i+1)begin
case(i)
0: tx<= 1'b0;
1: tx<= data[0];
2: tx<= data[1];
3: tx<= data[2];
4: tx<= data[3];
5: tx<= data[4];
6: tx<= data[5];
7: tx<= data[6];
8: tx<= data[7];
9: tx<= 1'b1;
endcase 
#560;
end
endtask


//例化
 uart_rx uart_rx_inst(
//system singal 
. clk (clk ),
. rst_n         (rst_n ),
//usart signal
. rx (tx),
//other signal 
. rx_data         (rx_data),
. po_flag (po_flag) 


);
endmodule






  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值