interface(接口)
程序员文章站
2022-04-25 15:53:43
...
interface能干什么?
- 接口可用于设计也可以用于验证。
- 接口将
driver
和dut
区分开,在TB
中统一去管理。
3.interface
类型可定义端口类型
(input和output),定义双向信号,可使用initial和always,使用function
和task
,跟module使用性质很像。
interface定义(interface可做远远不止这些):
注意: 可以不定义端口信号,全都放到变量列表中。
interface vif(input bit clk) //定义端口输入信号
logic[1:0] a, b; //定义变量信号
logic rst;
endinface
硬件module 或者软件 testbench 中传入interface:
module arb(vif if); //作为参数 传入interface
always @(*);
if(if.rst)
if.a <= 2'b00;
.......
endmodule
以上定义完后,可在top层中对interface,dut,testbench进行例化:
module top;
bit clk;
always #5 clk = ~clk; //产生时钟
vif if(clk); //给interface传入时钟
arb(if); //给dut传入interface
test(if); //给test传入时钟interface
接口中的时钟
由于testbench中在时钟上升或下降沿沿采用时有延迟,那么可以定义一个clocking时钟块。代码如下:
clocking bus @(posedge clock1); //clock1 时钟上升沿
default input #10ns output #2ns; //input信号在时钟上升沿之前的10ns进行采样,所有output信号在上升沿的之后延迟2ns进行驱动
input data, ready, enable;
output negedge ack; //不指定则在时钟的上升沿后的2ns进行驱动,现在指定时时钟的下降沿进行驱动
input #1step addr; //不指定时则在时钟上升沿之前的10ns进行采用,现在是指定在clock的上升沿的#1step时间段内采样
endclocking
例子(1):
例子(2):对于input采样信号
module clocking1;
bit vld, grt, clk;
clocking ck @(posedge clk);
default input #3ns output #3ns;
input vld;
output grt;
endclocking
initial forever #5ns clk <= !clk;
initial begin:drv_vld
$display("$%0t vld is assigned %d", $time, vld);
#3ns vld=1; $display("$%0t vld is assigned %d", $time, vld);
#10ns vld=0; $display("$%0t vld is assigned %d", $time, vld);
#8ns vld=1; $display("$%0t vld is assigned %d", $time, vld);
end
initial begin:drv_grt
@ck ck.grt <= 1; $display("$%0t grt is assigned %d", $time); //在时钟上升沿使用clocking块进行驱动数据
end
initial forever
@ck $display("$%0t vld is sampled as %d at sampled time $%0t", $time, vld, $time); //在时钟的上升沿,直接去进行采样。
initial forever
@ck $display("$%0t ck.vld is sampled as %d at sampled time $%0t", $time, ck.vld, $time-3); //在时钟上升沿使用clocking块进行采样。
initial forever
@grt $display("$%0t grt is sampled as %d at sampled time $%0t", $time, grt) //对grt信号进行采样。
endmodule
上一篇: AsyncTask的使用
下一篇: flex,float,绝对定位应用总结