内容发布更新时间 : 2025/3/12 1:44:52星期一 下面是文章的全部内容请认真阅读。
=阻塞串行
<=非阻塞并行
1)时序逻辑----使用非阻塞赋值 2)锁存器----使用非阻塞赋值
3)用always块生成的组合逻辑----用阻塞赋值 4)在同一个always块中既有时序逻辑又有组合逻辑--- 用非阻塞赋值
5)在同一个always块中不要既用阻塞赋值又用非阻塞赋值 6)不要在一个以上的always块中对同一个变量赋值 7)用$strobe显示用非阻塞赋值指定的变量值
8)不要用 #0 过程性赋值Modport将信号分组并指明方向
函数不能消耗时间,不能有#100@(posedge 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(arb_if.test 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.reverse(); //逆序 d.sort(); //从小到大 d.rsotr(); //从大到小 d.shuffle();
时钟块
指定同步信号相对于时钟的时序
Interface arb_if(input bit clk); Logic [1:0] a,b; Logic rst;
Clocking cb @(posedge clk); Output a; Input b;
Modport test(output rst, Clocking cb); Endinterface
Module arb(arb_if.test arbif); Initial begin Arbif.cb.a<=0; @arbif.cb; $dispiay(………..) Endmodule
断言
A1:assert(bus.cb.a==2’b01)
Else $error(“grant not asserted”);
四种有输出消息的函数可在断言内部使用 $info $waring $error $fatal
要验证这样一个属性:“当信号a在某一个时钟周期为高电平时,那么在接下来的2~4个时钟周期内,信号b应该为高电平”。用Verilog语言描述这样一个属性需要一大段代码,而用SVA描述就只需要几行代码。下面的代码为SVA。 例1:
property a2b_p; @(posedge sclk) $rose(a) |-> [2:4] $rose(b); endproperty
a2b_a: assert property(a2b_p); a2b_c: cover property(a2b_p);
并发断言
并发断言的计算基于时钟周期,在时钟边沿根据变量的采样值计算表达式。它可以放在过程块(procedural block)、模块(module)、接口(interface)或一个程序块(program)的定义中。并发断言可以在静态(形式化)验证工具和动态(仿真)验证工具中使用。上面的例子就是并发断言