SystemVerilog 语言部分(二)
1. 接口 interface
- 接口可以用作设计,也可以用作验证
- 在验证环境中,接口可以使得链接编的简洁而不易出错
- interface和module的使用性质很像,可以定义端口,也可以定义双相信号;它可使用initial和always,也可以定义func和task
- interface可以在硬件环境和软件环境中传递,例如作为module的端口列表,也可以作为软件方法的形式参数(virtual intf)
- 初学可以将interface看成一个“插排”,而DUT与TB之间的数据驱动关系都可以使用interface这个插排来完成
example:
1 ##################design####################### 2 3 interface arb_if(input bit clk); 4 5 logic [1:0] grant, request; 6 7 logic rst; 8 9 endinterface 10 11 module arb(arb_if arbif); //对interface不需要指明方向 12 13 ... 14 always @(posedge arbif.clk or posedge arbif.rst) begin 15 16 if (arbif.rst) 17 arbif.grant <= 2'b00; 18 else 19 arbif.grant <= next_grant; 20 end 21 22 endmodule 23 24 ###############对于testbench##################### 25 26 module test(arb_if arbif); 27 28 initial begin 29 30 @(posedge arbif.clk) arbif.request <= 2'b01; 31 $display("@%0t: Drove req = 01", $time); 32 repeat (2) @(posedge arbif.clk) 33 if (arbif.grant != 2'b01) $display("@%0t: a1: grant != 2'b01", $time); 34 $finish 35 end 36 37 endmodule
接口的优势:



module: 模块里面可以例化接口,接口不能例化模块
2 采样和数据驱动
竞争问题:为了避免在RTL仿真行为中发生信号竞争问题,建议通过非阻塞赋值或者特定的信号延迟来解决同步问题

a会被综合成4个寄存器,b在这里是wire型,因为b和a 同步,如果b是FF,应该写为b<=a,有一拍的延迟
- 在仿真中,为了尽量避免时序电路中时钟和驱动信号的时序竞争问题,我们需要给出尽量明确的驱动时序和采样时序
- 默认情况下,时钟对于组合电路的驱动会添加一个无限最小时间(delta-cycle)的延迟,而该延迟无法用绝对时间单位衡量,它要比最小时间单位精度(fs)还小(这个延迟只在仿真中有意义)
- 在一个时间片(time-slot)中可以发生很多事,即让仿真器运行一个delta-cycle的时间(一个time-slot包含无穷个delta-cycle)
note:模拟被驱动信号和驱动信号之间一定会有延迟

同一时刻,clk1在上升沿采样得到d1数值为1,clk2是2
打开delta-cycle模式:选取工具栏处“expanded time deltas mode”,再选"expanded time at active cursor"


接口中的clocking
- 硬件和软件通过interface来实现,也可以通过modport进一步限定传输方向
- 在接口中声明clocking,消除信号竞争问题
clocking bus @(posedge clock1); default input #10ns output #2ns; input data, ready, enable; output negedeg ack; input #1step addr; endclocking
- 第一行定义了一个clocking块bus,由clock1的上升沿来驱动和采样
- 第二行指出了在clocking块中所有的信号,默认情况下在clocking上升沿的前10ns对输入采样,在后2ns对其进行输出驱动
- 第三行声明三个输入信号,采用了默认输入event
- 第四行驱动ack信号,并知名在下降沿后2ns进行驱动
- 第五行自定义采样事件,即clock1上升沿前的1step,这里1step会使得采样发生在clock1上升沿的上一个time-slot采样区域,保证采样到的数据是上一个时钟周期
note:对输出信号做驱动,对输入信号做采样
1 step指的是在时钟上升沿的左侧


note: clocking可以在interface中添加多个,同一个变量也可以在不同clocking中声明不同方向
initial是并行执行
@clk == @(posedge clk)



example2:



Conclusion:
- 为了避免可能的采样竞争问题,verifer应该在验证环境的驱动环节就添加固定延迟,使得仿真波形中更容易体现出时钟与被驱动信号之间的时序前后关系,同时也便于DUT的准确处理和TB的准确采样
- 如果TB在采样从DUT送出的数据,在时钟与被驱动信号之间存在delta-cycle时,也应该考虑在时钟采样沿的更早时间段去模拟建立时间要求采样,这种方法也可以避免由于delta-cycle问题带来的采样竞争问题
浙公网安备 33010602011771号