欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

system verilog语法

程序员文章站 2022-05-07 19:02:36
...

几乎通用的数据类型——logic
是4态数据类型的变量,只允许使用一个驱动源,或者来自于一个或者多个过程快的过程赋值。
位宽可变,logic类型可以替代所有其他类型,包括reg类型。
wire数据类型仍旧使用的原因:多驱动源总线,如多路总线交换器;双向总线(两个驱动源)。
bit是两态数据类型。
system verilog对端口的定义没有限制。

typedefine——用户定义的类型,允许生成用户定义的或者容易改变的类型定义,好的命名规则用“_t”做后缀。

aaa@qq.com*
begin
next=’x;
…….
//*表示对语句进行“填满”的操作。’x等价于’bx,’z等价于’bz,’1所有位赋为1,’0所有位赋为0。

特定逻辑过程
always_comb 组合逻辑过程 ,与aaa@qq.com*差别不大
always_latch 生成锁存器
always_ff 时序逻辑

void函数——与task不同
1、不能等待
2、不能包括延迟
3、不能包括事件触发
4、被always_comb搜寻到的信号自动加入敏感列表

module comb(output bit_t [2:1]y,input bit_t a,b,c);
always_comb//等价于aaa@qq.com(a,b,c).如果是aaa@qq.com*,则等价于aaa@qq.com(a).
  orf1(a);
function void orf1;
  input a;
  y[1]=a|b|c;
endfunction
always_comb//等价于aaa@qq.com(a)
  ort1(a);
task ort1;
  input a;
  y[2]=a|b|c;
endtask
endmodule

priority和unique——设计意图
枚举类型 enum{ } 变量名

隐含的端口连接(sv新增的)
.name 例如:multiplier multiplier(.mult, .mop1, .data); 名称要求一致
.* 例如:multiplier multiplier(.*);//名称要求一致
说明:
1、在同一个实例引用中禁止混用.*和.name端口;
2、允许在同一个实例引用中使用.name和.name(signal)连接;
3、也允许在同一个实例引用中使用.*和.name(signal)的连接;
4、必须使用.name(signal)的情况:
位宽不匹配 inst u1(…, .data(data[7:0]),…);
名称不匹配 inst u2(…,.data(pdata), …);
没有连接的端口 inst u3(…,.berr(),. …);

packed和unpacked的数组
未打包的位数组 bit a [3:0];
打包的位数组 bit [3:0] p; //打包的索引可以分块访问,可以对整个存储器进行操作。而未打包的只能按位访问。

数据的组织
struct 与c语法相似,这里分为struct packed
system verilog语法
system verilog语法

接口的使用
system verilog语法

接口的详细使用见ppt80页。https://wenku.baidu.com/view/bb832e8f6529647d2728528b.html