1、基本架构
/*================================================*\
Filename ﹕
Author ﹕ Adolph
Description ﹕ 仿真设计文件基本架构
Called by ﹕
Revision History ﹕ 2022-4-24
Revision 1.0
Email﹕
Company﹕
\*================================================*/
`timescale 1ns/1ns //仿真系统时间尺度定义——>仿真系统时间单位和时间精度
`define clk_period 20 //时钟周期参数定义 20ns ——> 50MHz
module /*这里输入模块名称*/();
//激励信号定义
reg Clk ;
reg Rst_n ;
reg in ;
//响应信号定义
wire out ;
//实例化
my_design my_design(
.clk (Clk ),
.rst_n (Rst_n ),
.in (in ),
.out (out )
);
//产生时钟
initial Clk = 1'b0;
always #(`clk_period / 2) Clk = ~Clk;
//产生激励
initial begin
Rst_n = 1'b0;
in = 1'b0;
#(`clk_period * 10 + 3);
Rst_n = 1'b1;
#(`clk_period * 10);
in = 1'b1;
repeat(10)begin
in = ${random} % 2;
#`clk_period;
end
#(`clk_period * 10);
$stop; //暂停仿真
end
endmodule
2、task简介
//==========================================================================
//== 输入信号任务封装
//==========================================================================
task i_data;
input [7:0] dut_data;
begin
@(posedge data_en); send_data = 0;
@(posedge data_en); send_data = dut_data[0];
@(posedge data_en); send_data = dut_data[1];
@(posedge data_en); send_data = dut_data[2];
@(posedge data_en); send_data = dut_data[3];
@(posedge data_en); send_data = dut_data[4];
@(posedge data_en); send_data = dut_data[5];
@(posedge data_en); send_data = dut_data[6];
@(posedge data_en); send_data = dut_data[7];
@(posedge data_en); send_data = 1;
#100;
end
endtask
//调用方法:i_data(8'hXX);
//==========================================================================
//== 多输入信号任务封装
//==========================================================================
task more_input;
input [07:0] a;
input [07:0] b;
input [31:0] times;
output [08:0] c;
begin
repeat(times) @(posedge clk) //等待 times 个时钟上升沿
c=a+b;
end
endtask
//调用方法:more_input(x,y,t,z); //按声明顺序
3、触发条件控制符 @ 和 wait
/* @为边沿触发 */
initial begin
start = 1;
repeat(5) @(posedge clk) //等待5个时钟上升沿
start = 0;
end
/* wait为电平触发 */
initial begin
start = 1;
wait(en); //等待en==1
start = 0;
end
4、常用仿真控制语句(系统函数)
$random //产生随机数
$random % n //产生范围 {-n,n} 的随机数
{$random} % n //产生范围 { 0,n} 的随机数
$stop //停止运行仿真,Modelsim 中可继续仿真
$finish //结束运行仿真,Modelsim 中不可继续仿真
$stop(n) //带参数系统任务,根据参数 0、1、2 不同,输出仿真信息
$finish(n) //带参数系统任务,根据参数 0、1、2 不同,输出仿真信息
/*------------------------------------------------------------------------*\
0:不输出任何信息
1:输出当前仿真时刻和位置
2:输出当前仿真时刻、位置和仿真过程中用到的 memory 以及 CPU 时间的统计
Ps:不带参数时,其打印结果请读者自行探索
\*------------------------------------------------------------------------*/
//仿真终端显示描述
$monitor //仿真打印输出,打印出仿真过程中的变量,使其终端显示
/*------------------------------------------------------------------------*\
$monitor($time,,,"clk=%d reset=%d out=%d",clk,reset,out);
\*------------------------------------------------------------------------*/
$display //终端打印字符串,显示仿真结果等
/*------------------------------------------------------------------------*\
$display(” Simulation start ! ");
$display(” At time %t,input is %b%b%b,output is %b",$time,a,b,en,z);
\*------------------------------------------------------------------------*/
$time //返回 64 位整型时间
$stime //返回 32 位整型时间
$realtime //实行实时模拟时间
5、文本输入
$readmemb/$readmemh("<数据文件名>",<存储器名>);
$readmemb/$readmemh("<数据文件名>",<存储器名>,<起始地址>);
$readmemb/$readmemh("<数据文件名>",<存储器名>,<起始地址>,<结束地址>);
$readmemb
/*------------------------------------------------------------------------*\
读取二进制数据,读取文件内容只能包含:空白位置,注释行,二进制数
数据中不能包含位宽说明和格式说明,每个数字必须是二进制数字。
\*------------------------------------------------------------------------*/
$readmemh
/*------------------------------------------------------------------------*\
读取十六进制数据,读取文件内容只能包含:空白位置,注释行,十六进制数
数据中不能包含位宽说明和格式说明,每个数字必须是十六进制数字.
\*------------------------------------------------------------------------*/
例如:
/*------------------------------------------------------------------------*\
//mem.dat 文件内容
@001
AB CD
@003
A1
\*------------------------------------------------------------------------*/
reg [7:0] memory[7:0] ;//声明 8 个 8 位存储阵列
integer i ;
initial begin
$readmemh("mem.dat",memory);//读取系统文件到存储器中的给定地址
for(i=0;i<4;i=i+1)
$display("Memory[%d]=%h",i,memory[i]);
end
/*------------------------------------------------------------------------*\
//仿真输出为
Memory[0] = xx;
Memory[1] = AB;
Memory[2] = CD;
Memory[3] = A1;
\*------------------------------------------------------------------------*/
参考:
博客园,咸鱼FPGA