【IC验证】systemverilog的设计特性

打印 上一主题 下一主题

主题 870|帖子 870|积分 2610

一.概述

systemverilog为了便于设计,添加了一些可综合的设计特性。其中重要包罗以下部分:
添加了always_comb、always_latch、always_ff等过程块;
添加了关系运算符==?和!=?,表示进行关系比对时不考虑带**?**的位;
添加了inside判断符,用于判断一个变量的值是否在一系列值中;
完善了case条件分支语句,添加了unique case和priority case;
添加了接口(interface),从而将通信和协议检查进一步封装;
添加了雷同C语言的数据范例,比方int、byte;
添加了用户自界说范例、罗列范例、结构体范例;
添加了范例转换,常用的有$cast(T,S)方法或’();
添加了包(package)从而使得多个设计之间可以共享公共范例和方法;
添加了方便的赋值操作符,比方++,+=,===;
添加了priority和unique case语句;
二.面向硬件的过程语句块

1.说明

always语句块被细分为了:
always_comb:组合逻辑语句块;
always_latch:锁存器逻辑语句块;
always_ff:时序逻辑语句块;
作用:EDA软件可以更正确地检查设计的实现意图;
2.always_comb

always_comb可以主动嵌入敏感事件列表;
always_comb可以禁止共享变量,即赋值左侧的变量无法被另外一个过程块所赋值;
软件会检查该过程块,如果其所表示的不是组合逻辑,那么就会发出警告;
always_comb会在0时候主动触发一次,无论在0时候是否有敏感信号列表中的信号发生变化;
铭感事件列表的特点:
@*不要求可综合的建模要求,但always_comb则会限制其他过程块对同一变量进行赋值;
@*敏感列表可能不完全,比方如果一个过程块调用一个函数,那么@*则只会将该函数的形式参数主动声明到敏感事件列表,而不会将该函数睁开;
always_comb则将被调用函数中可能到场运算的其他信号也声明到敏感事件列表中;
2.always_latch

always_latch表示锁存逻辑,会主动插入敏感事件列表;
EDA工具会主动检查always_latch是否被真正实现了锁存逻辑;
3.always_ff

敏感事件列表必须要指明posedge或者negedge,从而使得EDA工具实现同步或者异步对的复位逻辑;
EDA工具也会验明always_ff是否被实现了时序逻辑;
三.关系运算符

1.说明

添加了关系运算符==?和!=?,表示进行关系比对时不考虑带**?**的位;
2.例子

(1)代码:
  1. module oper_char;
  2.     reg [3:0] a = 4'b01zx;
  3.     initial begin
  4.         if(a ==? 4'b01??)
  5.             $display(" yes ");
  6.         else
  7.             $display(" no");
  8.     end
  9. endmodule
复制代码
(2)结果:
用verilog编译:报错

用systemverilog编译执行:

四.inside判断符

1.说明

添加了inside判断符,用于判断一个变量的值是否在一系列值中;
2.例子

  1. module oper_char;
  2.     reg [3:0] a = 4'd3;
  3.     reg [3:0] b = 4'd5;
  4.     initial begin
  5.         if(a inside {4'd0,4'd1,4'd2,4'd3,4'd4})
  6.             $display(" a:yes ");
  7.         else
  8.             $display(" a:no");
  9.           if(b inside {4'd0,4'd1,4'd2,4'd3,4'd4})
  10.             $display(" b:yes ");
  11.         else
  12.             $display(" b:no");
  13.     end
  14. endmodule
复制代码
结果:

五.条件分支语句

(1)说明

完善了case条件分支语句,添加了unique case和priority case;
case条件分支:各条件分支可以重叠,在判断时从上至下进行匹配,匹配后跳出;
unique case:要求各条件分支必须互斥,且必须满足一个分支;
priority case:各条件分支可以重叠,在判断时从上至下进行匹配,匹配后跳出,强调优先级
(个人见解:目前没有看出case和priority case的显着区别)
(2)例子(case和unique case的区别)

case的例子:
  1. module oper_char;
  2.     reg [3:0] a = 4'b0011;
  3.     initial begin
  4.             case(a)
  5.             4'b0001: $display("case1 yes");
  6.                     4'b0011: $display("case2 yes");
  7.                     4'b0011: $display("case3 yes");
  8.                     default: $display("default yes");
  9.             endcase
  10.     end
  11. endmodule
复制代码
结果:

分析:
条件分支2和条件分支3重叠,优先匹配前面的;
unique case的例子:
  1. module oper_char;
  2.     reg [3:0] a = 4'b0011;
  3.     initial begin
  4.             unique case(a)
  5.             4'b0001: $display("case1 yes");
  6.                     4'b0011: $display("case2 yes");
  7.                     4'b0011: $display("case3 yes");
  8.                     default: $display("default yes");
  9.             endcase
  10.     end
  11. endmodule
复制代码
结果:

分析:
条件分支重叠,报出警告;
六.接口


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

八卦阵

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表