使用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