0
点赞
收藏
分享

微信扫一扫

ic验证笔记-20天挑战day5.2

妖妖妈 2022-04-18 阅读 98
硬件工程

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

举报

相关推荐

0 条评论