1. 时钟产生:
1)使用initial方式产生占空比50﹪的时钟
initial
begin
CLK = 0;
#delay; //delay是延时时间
forever
#(period/2) CLK = ~CLK;
end
注意:一定要给时钟赋初始值,因为信号的缺省值为z,如果不赋初值,则反相后还是z,时钟就一直处于高阻z状态。
产生的时钟信号如下图所示:
2)使用always方式
initial
CLK = 0;
always #(period/2) CLK = ~CLK;
3)使用repeat产生确定数目的时钟脉冲
initial
begin
CLK = 0;
repeat(6) //重复6次
begin
#(period/2) CLK = ~CLK;
end
end
4)产生占空比非50﹪的时钟
initial
CLK = 0;
always
begin
#3 CLK = ~CLK;
#2 CLK = ~CLK;
end
2. 仿真控制语句及显示
仿真控制语句以及系统能够任务描述:
$stop //停止运行仿真,modelsim中可以继续仿真
$stop(n) //带参数系统任务,根据参数0,1,或2不同,输出仿真信息
$finish //结束运行仿真,不可继续仿真
$finish(n) //带参数系统任务,根据参数的不同:0,1或2,输出仿真信息
// 0: 不输出任何信息
// 1: 输出当前仿真时刻和位置
// 2:输出房前仿真时刻、位置和仿真过程中用到的memory以及cpu时间的统计
$random //产生随机数
$random%n //产生范围-n到n之间的随机数
{$random}%n //产生范围0到n之间的随机数
仿真终端显示描述
$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位整型时间
$realtiime //实行实型模拟时间
3.文件数据读写
声明文件指针类型:integer类型
1) 打开文件函数:integer $fopen(file_path_string,file_openway_string);
@file_path_string:文件路径及名称,支持绝对路径及相对路径,绝对路径使用'/'号而非'\'
@file_openway_string:文件打开方式,支持w、r、wb、rb
return :返回文件指针
注:若文件不存在,则新建。若文件存在,则原先内容删除,重新写入
2) 文件写入函数:$fdisplay或者$fmonitor
void $fdisplay(file_context, string_format, string_data);
@filecontext:即文件的句柄, integer类型
@string_format: 字符串格式
@string_data: 依据string_format格式的数据
3)关闭文件函数$fclose
void $fclose(file_context)
@file_context:文件句柄,这里用integer类型
流程:先用$fopen打开文件,获取文件句柄,再$fdisplay写入数据,再用$fclose关闭文件
代码示例:
file_1 = $fopen("D:/xilinx_project/comp/comp.srcs/sim_1/new/test1.txt","wb");
if(!file_1)
begin
$fclose(file_1);
$stop;
end
else
begin
$fdisplay(file_1,"%b\t%b\t%b\n%b\t%b\n",4'hA,4'h8,4'h9,4'hb,4'h1);
//4'hA:代表4位,hA代表是十六进制的A,即一个十六进制是4位
$fclose(file_1);
end
3.2 文件读操作
分为二进制$readmemb与$readmemh,分别对应二进制与十六进制
void $readmemb(file_path,mem,[start_num, end_num]);
@file_path:文件路径,字符串型
@mem: 寄存器,reg型数组
[start_end, end_num]:可选参数,分别对应,寄存器读入的开始位置、及末尾位置
注:不指定位置,默认从头读到尾
//寄存器声明:
reg[1:0] mem[5:0]; //mem为6个以2个位reg构成的寄存器
//块中
begin
$readmemb("D:/xilinx_project/comp/comp.srcs/sim_1/new/test1.txt",mem,0,3);
$display("memory is %b %b %b",mem[0],mem[1],mem[4]);
end