sv 环境搭建流程
1.打开要求文档,打开.v文件并阅读。
了解 目的,功能,输入输出,计算时钟周期
时钟频率x时钟周期=1 (1m hz对应时钟周期为1000ns)
2.根据DUT的输入输出完成xx_interface.sv
对于TB来说 ,DUT输入输出信号方向与TB信号方向相反.
3.顶层模块 top_xx.sv的编写
顶层文件中
(1 包含 SYSTEM CLOCK的生成(forever #xx xxxx;)
(2 interface的例化(首先例化interface,并与系统时钟相连,interface只需要input bit clock)
(3 program 的例化括号里只需连接例化出的interface的名字
(4 DUT的例化 举例
fifo dut_fifo(
.dut的端口a(interface名.a),
.dut的端口b(interface名.b),
...
)
这里的连接包括interface.clk,全部连接好之后完成
(5 可以把$fsdbDumpfile ();
$fsdbDumpMDA();
$fsdbDumpvars (0,”顶层模块的名字”);(不加名字更好,不然verdi里没法把其他模块的信号拉出来看.)
写在这里的initial begin end之间
4.program xxx的编写(interface名 例化名)
`timescale 1ns/10ps
`include”packet.sv”
`include”ScoreBoard.sv”
program (interface io_a,io_b)
logic;
bit;
parameter;
类的对象例化;(packet,scoreboard)
initial begin
new();//需要随机的信号
//==================================================
//将这些部分集成为一个不会死循环的大task,便于复用
//task main_process();
reset();
config();
fork
begin
gen();//随机or定向产生信号
drive();//发送信号
end
begin
rec();//forever 接受信号
end
begin
sb.compare(); //forever比较信号
(compare完毕删除数组及计数变量,使得task可以在一个program 复用)
end
begin
(看门狗定时diasble任务,退出程序,避免死循环,亦或者可以使用flag定量 结束任务,更合理.)
end
join
//endtask:main_process
//=================================================
end
//===================================
//tasks
task reset();
endtask:reset
task config();
endtask:config
task gen();
endtask:xxx
...
====================================
endprogram