=阻塞串行
<=非阻塞并行
1)时序逻辑----使用非阻塞赋值
2)锁存器----使用非阻塞赋值
小丽花3)用always块生成的组合逻辑----用阻塞赋值
4)在同一个always块中既有时序逻辑又有组合逻辑---
用非阻塞赋值
5)在同一个always块中不要既用阻塞赋值又用非阻塞赋值
6)不要在一个以上的always块中对同一个变量赋值
7)用$strobe显示用非阻塞赋值指定的变量值
8)不要用 #0 过程性赋值Modport将信号分组并指明方向
函数不能消耗时间,不能有#100@(podge clk)wait之类的阻塞语句
向晚意不适全诗Interface arb_if(input bit clk);月亮变化
Logic [1:0] a,b;
Logic rst;
Modport test(output a,rst,
Input b,clk);
Endinterface
Module arb(st arbif);
…………
Endmodule
数组定位
重在参与Int tq[$],d[]=’{9,1,8,3,4,4};
Tq=d.find_index(x) with (item>3); //{0,2,4,5}得到的是脚标
Tq=d.find with (item>3); //{9,8,4,4}
数组求和
Int count,total;
Count=d.sum with(item>7); //2:{9,8} 返回结果为元素与7比较表达式返回1为真或者零这里面返回 ,{1,0,1,0,0,0}求和得2
Total=d.sum with ((item>7)*item) ; //{1,0,1,0,0,0}和对应元素相乘求和得17=9加8
数组排序
d.rever(); //逆序
胡萝卜猪肉饺子
d.sort(); //从小到大春天衣服
d.rsotr(); //从大到小
d.shuffle();
时钟块
指定同步信号相对于时钟的时序
Interface arb_if(input bit clk);
Logic [1:0] a,b;
Logic rst;
Clocking cb @(podge clk);
Output a;
Input b;
急递铺Modport test(output rst,
Clocking cb);
Endinterface
Module arb(st arbif);
Initial begin
A<=0;
@arbif.cb;
$dispiay(………..)
Endmodule
断言
A1:asrt(==2’b01)
El $error(“grant not asrted”);
四种有输出消息的函数可在断言内部使用
$info
$waring
$error
$fatal
湖北返工要验证这样一个属性:“当信号a在某一个时钟周期为高电平时,那么在接下来的2~4个时钟周期内,信号b应该为高电平”。用Verilog语言描述这样一个属性需要一大段代码,而用SVA描述就只需要几行代码。下面的代码为SVA。
例1:
property a2b_p; @(podge sclk) $ro(a) |-> [2:4] $ro(b); endproperty
a2b_a: asrt property(a2b_p); a2b_c: cover property(a2b_p);
并发断言
并发断言的计算基于时钟周期,在时钟边沿根据变量的采样值计算表达式。它可以放在过程块(procedural block)、模块(module)、接口(interface)或一个程序块(program)的定义中。并发断言可以在静态(形式化)验证工具和动态(仿真)验证工具中使用。上面的例子就是并发断言
SVA提供了3个内嵌函数,用于检查信号的边沿变化。
$ro(布尔表达式或信号名)