日常记录(33)虚接口
虚接口
没有虚接口,那interface无法接入到class中。
interface SBus ();
// nets
logic req, grant;
logic [7:0] addr, data;
endinterface : SBus
class SBusTrans;
// data or class properties
virtual SBus bus;
function new(virtual SBus s);
bus=s;
endfunction : new
task request();
bus.req=1;
endtask: request
task wait_for_bus();
@(posedge bus.grant);
endtask: wait_for_bus
endclass : SBusTrans
module devA (SBus s);
initial begin
int handler=$fopen("devA.log");
$fmonitor(handler, "A req, grant %d, %d", s.req, s.grant);
end
endmodule
module devB (SBus s);
initial begin
int handler=$fopen("devB.log");
$fmonitor(handler, "B req, grant %d, %d", s.req, s.grant);
end
endmodule
module top ();
SBus s[1:4]();
devA a1(s[1]);
devB a2(s[2]);
initial begin
SBusTrans t[2];
t[0]=new(s[1]);
t[1]=new(s[2]);
#5 t[0].request;
#5 t[1].request;
end
endmodule
输出
cat dev* A req, grant x, x A req, grant 1, x B req, grant x, x B req, grant 1, x
目标:
1.读懂代码,
2.编写程序
3.调试代码
黑盒测试:激励生成后,同时灌入DUT和参考模型,对比输出。
灰盒测试:在黑盒的基础上,不仅有参考模型,同时添加断言和监控在DUT内,结果比较
白盒测试:在DUT内部或外部添加监控和断言,结果比较。
验证要考虑的要素:
1.完备性:制定方案最大限度的验证被测设计。
2.可重用性:不同场合下验证环境架构的的兼容性。
3.可靠性:采用自动化工具完成系列操作。减少手动操作。
4.效率:给定时间内的验证工作投入产出最大化
5.性能:验证程序的效率
强制转换
枚举,转换前有一个'.
module taa ();
typedef enum {R, G, B} colors;
colors c;
initial begin
c=G;
c=colors'(2);
$display("color is %s", c);
end
endmodule
类型判定、ref与input、默认参数、默认赋值
\$typename进行参数类型判定,然后通过=进行数据传递,然后在function里的第二个参数前,加了input防止变成ref类型报错。
default可以添加默认的数据,但是被判断不能混合赋值,这里进行了分两步的方式赋值。
完全不指定方向,function中默认第一个为input类型,完全不指定类型,默认为logic类型。
module taa ();
function void calc(ref int a[], input int length=a.size-1);
int sum=0;
for (int i = 0; i <length+1; i++) begin
sum+=a[i];
end
$display("the sum value of it is %d", sum);
endfunction: calc
initial begin
int aa[10]={default:1};
int bb[];
aa[0:3]={1,2,3,4};
bb = aa;
$display("typename %s", $typename(aa));
$display("typename %s", $typename(bb));
calc(bb);
end
endmodule
输出
typename int$[0:9] typename int$[] the sum value of it is 16
Fork-Join的展开化
注意automatic的位置
module tbb ();
initial begin
automatic int i;
for (int i = 0; i < 10; i++) begin
fork
$display("i is %d", i);
join_none
end
$display("start...");
for (i = 0; i < 10; i++) begin
fork
$display("automatic i is %d", i);
join_none
end
for (i = 0; i < 10; i++) begin
fork
automatic int j=i;
$display("replace i is %d", j);
join_none
end
end
endmodule
输出
start... i is 10 i is 10 i is 10 i is 10 i is 10 i is 10 i is 10 i is 10 i is 10 i is 10 automatic i is 10 automatic i is 10 automatic i is 10 automatic i is 10 automatic i is 10 automatic i is 10 automatic i is 10 automatic i is 10 automatic i is 10 automatic i is 10 replace i is 0 replace i is 1 replace i is 2 replace i is 3 replace i is 4 replace i is 5 replace i is 6 replace i is 7 replace i is 8 replace i is 9
参数化信箱
参数化信箱内容为string
module tcc ();
typedef mailbox #(string) box2;
box2 ma2=new;
string s;
initial begin
ma2.put("hello");
ma2.put(123);
ma2.get(s);
$display("get : %s ",s);
// error: mismatching
/* ma2.get(s); */
/* $display("get : %s ",s); */
end
endmodule
输出
get : hello
Le vent se lève! . . . il faut tenter de vivre!
Le vent se lève! . . . il faut tenter de vivre!

浙公网安备 33010602011771号