文章目录
- 一、initial
- 二、$finish $stop
- 三、$display $monitor
- 四、$time $realtime
- 五、$random $random(seed)
- 六、$readmemb $readmemh
- 七、$fopen $fclose
- 八、task
- 九、存储器
- 十、while for repeat
- 十一、force release
- 十二、fork/join
- 总结
基本都是不可综合语句
一、initial
initial语句用来对变量进行初始化,仿真器在仿真时刻0就可以得到初始值,如果不进行初始化,变量初始化为X。
initial
beginclock = 1‘b0;forever begin //循环语句#5 clock = ~clock; //5ns偏转一次,为10ns时钟,对应100MHzend
end
二、$finish $stop
$finish表示仿真结束
$stop表示仿真停止,但是不退出,在命令提示符后输入. 继续执行
三、$display $monitor
$display 打印,显示错误异常信息为主
$monitor相似功能,但是每次观察的信号发生改变就会打印一次。
四、$time $realtime
$time 64位整数乘以`timescale 1ns/10ps 的仿真时间单位(1ns),再四舍五入。
$realtime相似功能,但是返回值包括小数。
当`timescale 1ns/10ps时候,对应9.4ns
$time | 返回9ns |
---|---|
$realtime | 返回9.4ns |
五、$random $random(seed)
$random取随机数,返回一个32位的带符号的随机整数。
{$random} 非负整数。
$random(seed) 其中seed指出随机数的序列
六、$readmemb $readmemh
$readmemb 用于存储器建模时的初始化,将一个文本文件里的数据,写入存储器。
$readmemh 其中readmemb 以二进制数的形式写入,readmemh以十六进制数写入。
`timescale 1ns/10ps
module myrom (read_data, addr, read_en_);input read_en_;input [3:0] addr;output [3:0] read_data;reg [3:0] read_data;reg [3:0] mem [0:15];initial$readmemb ("my_rom_data", mem);always @( addr or read_en_)if (! read_en_)read_data = mem[addr];
endmodule
七、$fopen $fclose
可以打开和关闭文件,用
$fdisplay写进信息到文件中。
八、task
任务,可以用来写函数,是按顺序执行的过程。
通常用于读取和写数据到存储器来。
九、存储器
可以用数组搭一个存储器来,
reg [7:0] rom [1023:0];
用下面的任务可以初始化作用
十、while for repeat
while以及for就是循环语句
repeat和for等价
repeat(3)等价于 for(integer i=0;i<3;i++)
十一、force release
force用来将固定值赋值给reg或者wire类型变量
release执行前变量值不会发生改变,执行后由具体驱动决定
十二、fork/join
fork/join内部的语句并发执行,当全部完成后才会执行后面的语句,内部用于并发执行多个仿真任务。
总结
我的Testbench模板
`timescale 1ns / 1ps
`define CLK_PERIOD 8 //125MHz
//
// School: Shanghaitech
// Engineer: Junluoyu
//
// Create Date: 2021/09/30
// Design Name:
// Module Name: _tb
// Project Name:
// Target Devices: ZCU106
// Tool Versions: vivado2019.1
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module _tb();
/*----------------------例化------------------------*//*----------------------时钟信号---------------------*/
initial clk = 1;
always #(`CLK_PERIOD/2) clk=~clk;
/*----------------------initial信号------------------*/
initial beginend
endmodule