interface可以在硬件域和软件域使用
dut和tb之间的数据驱动关系都可以用interface实现
interface arb_if(input bit clk);
logic [1:0] grant, request;
logic rst;
endinterface
module arb(arb_if arbif);
...
always @(posedge arbif.clk or posedge arbif.rst) begin
if(arbif.rst)
arbif.grant <= 2'b00;
else
arbif.grant <= next_grant;
...
end
endmodule
module test (arb_if arbif);
...
initial begin
//reset code left out
@(posedge arbif.clk) arbif.request <= 2'b01;
$display("@%0t: Drove req=01", $time);
repeat(2) @(posedge arbif.clk);
if(arbif.grant != 2'b01) $display("@%0t: a1:grant != 2'b01", $time);
$finish;
end
endmodule: test
interface 可以定义 参数,输入输出端口,函数和任务, 过程代码块
2.1采样和驱动的延迟
为了避免在RTL仿真行为发生的信号竞争问题,通过非阻塞赋值或者信号延迟来解决同步的问题
a = a+1;
b = a;
时钟的上升沿和数据的信号赋值;时钟对组合电路的驱动会默认添加一个无限小的延迟(delta_cycle)(时间单位s,ms, us,ns,ps,fs)
expanded time deltas mode
data会在t+1*delta_cycle 发生变化
2.2接口中的时钟块
clocking bus @(posedge clock1);//上升沿来驱动和采样
default input #10ns output #2ns//在上升沿前10ns对其进行输入采样,在事件后2ns进行输出驱动
input data, ready, enable;
output negedge ack;//下降沿驱动
input #1step addr;//上升沿前的1step(时间片)
endclocking
3.1测试
仿真的结束需要verilog函数主动结束仿真 $finish()
run 0
assign 在 0时刻就会执行,但是always等信号变化才执行
program隐式结束
将设计放入module,将测试采样放入program;program内部变量的赋值采用阻塞赋值,驱动外部的硬件信号采用非阻塞赋值
program软件域不能使用module例化和always块
3.2调试
library(库)是编译的产物,编译完默认放到library(work)中,想要使用其他library的package,需要config文件的配置;
sim window仿真窗口展示的是TB和DUT(design under test)的结构层次
process window过程窗口代表仿真在某一时间点initial,assign,always的状态,如果状态是active,表示改进程块正在运行,如果是ready,代表该进程块处于非活跃状态;
查看信号和波形
在sim window点击某一层次,然后在objects窗口中添加合适的信号到wave中 ,强制修改信号的数值(force),objects window,右击想要改变数值的信号,modify->force
利用工具栏快速跳转到信号的变化沿
在transcript使用log -r/*可以保存波形
$display()通过传递$time来显示消息发生的时间点,$display()显示不同的数据格式,%x(十六进制),%d(十进制),%b(二进制),%s(字符串),%t(时间)
$display()消息级别,$warning()(警告级别),$error()(错误级别),$fatal()(严重级别)
字符串的格式化$sformatf()
string s = $sformatf("Hello, %s!", name_s)
设置断点查看局部变量的数值变化,查看动态变量locals window,菜单栏view->locals
wave显示的是delta cycle运行完以后产生的数值
按expanded time at active cusor
软件信号值 ,动态变量locals, 硬件信号,静态变量objects
同样赋值+1动态变量运行两次的数值为1,而静态变量的数值赋值为2
调节信号的进制显示,右击信号,radix修改
wave窗口查看信号时间间距,底下第三下添加cursor