System Verilog语法基础要点

本文详细介绍了SystemVerilog的基础语法要点,包括Wire、reg、logic等数据类型的差异与应用,struct和packedstruct的使用场景,always_comb和always_ff的时序逻辑控制,以及运算符、条件语句、循环语句的使用。此外,还提到了task和function的异同,宏定义的使用,以及package和generate的概念。
摘要由CSDN通过智能技术生成

System Verilog语法基础要点



一、Wire, reg, logic, int, parameter, localparam

1. Wire, reg, logic

  • logic是sv对reg类型的改进,其不仅作为一个变量起作用(reg),还可以被连续赋值、门和module驱动(wire),这使得sv不需要再对reg和wire进行区分。
  • 但logic不能被多个信号驱动,例如inout类型的信号,则需要定义成wire。
  • logic是四态数据类型。

2. int


在这里插入图片描述

3. parameter, localparam

  • localparam 与 parameter 相同,只是它们不能通过defparam语句或例化直接修改。
  • localparam 可以用 parameter 来表示,从而达到用defparam或者例化修改parameter的值进而修改 localparam 的目的。

二、 Struct, packed struct, array, packed array

1. Struct, packed struct

  • verilog中并没有struct的说法,但struct的功能较少:class可以同时包含数据和代码,而struct本身只是数据的集合(是可综合的)。
    在这里插入图片描述
    在这里插入图片描述
  • sv提供了packed struct合并结构体,允许struct可以连续地在存储器内存放。
    应用场景 :1.减少储存器使用量 2.存储器的部分bit代表了某些特殊含义(比如处理器的inst opcode)
    在这里插入图片描述
  • 如果经常要对整个struct进行操作, 使用packed struct的效率会更高;如果操作经常针对struct内的成员,那么应该使用unpacked的struct。
    对于packed struct内尺寸不规则成员读写的代价颇高

2. array, packed array

  • sv引入了一种新的定宽数组声明方式,可以在变量名之后给出其维度来创建新array。
    下面两种声明方式是一样的

    int array1[8][4];
    int array2 [0:7][0:3];

  • 如果array地址读取越界,那么读出来的结果会是该信号类型的缺省值。对于四状态数组,读出来是X;对于双状态数组,读出来的结果是0。
  • 数组的初始化:单引号加大括号

    int array1 [4]='{0,1,2,3};

  • 批量初始化

    array2='{4{8}};
    array3='{9,8,default:1};

  • 在sv中,允许数组下标和位下标混用

    array[0][2:1]

  • packed array允许一个数组有时候被看成一个整体,有时候可以被看成是多个单独数据的组合。其存放时是连续的bit集合。(packed和unpacked array可以混用)
    packed声明就是多维尺寸放在变量前面写
    在这里插入图片描述
  • packed array适合经常对数组中某部分进行操作的情景。此外,如果要把数组作为@中的敏感信号,那么就需要用packed array。
    在这里插入图片描述
  • 对于某些刚开始不知道其大小的数组,我们可以先不声明其尺寸,用空下标定义,后面再利用new[]数组指定。
    在这里插入图片描述

三、Always, always_comb, always_ff

1. Always

  • sv保留了always语句,并且在循环中增加了 continue 和 break 的语法
  • 可以省略使用begin…end块了,还可以用:之后的增加变量名给begin…end块命名

2. always_comb, always_ff

  • sv中对always关键词进行细化了,always_comb专门用于组合逻辑,综合工具会判断always_comb块内是否是组合逻辑,以防不小心生成latch。在使用时需要注意always_comb内只能使用阻塞赋值=。
  • 针对要使用latch的情况,sv提供了关键词always_latch,在使用时不需要敏感信号列表。
  • 对于要使用ff的情况, 可以使用关键词always_ff。使用时需要敏感型号列表,信号前需要注意备注是否是正/负边沿触发。在使用时需要注意always_ff内只能使用非阻塞赋值<=。

四、运算符

在这里插入图片描述

五、If else, case, for

1. If else

  • 在always块里面使用
    if() … else …
    允许嵌套,嵌套用的也是 if() … else …
    允许没有else的情况出现,如果这样,那么被赋值的信号就会保持原值,相当于产生了一个latch

2.case

  • https://blog.csdn.net/jk_101/article/details/127682098

3. for, foreach

  • for的用法
    for的用法
  • foreach的用法在这里插入图片描述
    如果是多维数组,其索引变量用逗号隔开。如果要进行嵌套的foreach,在第二次遍历时,括号内变量要写成[,j]
    在这里插入图片描述

六、Task, function

  • task可以消耗时间,但是func不行:func不可以带有#延时或者阻塞语句,func若要调用task需要在fork join_none语句中
    在这里插入图片描述
    在这里插入图片描述

系统自带函数

  • $bits 占据的bit位数
  • $clog2 求底数为2的log值,可用于求地址
  • $error 输出自定义的错误信息,暂停仿真
  • $warning 输出自定义的错误信息,不暂停仿真
  • $info 输出自定义的错误信息,不暂停仿真
  • $display https://zhuanlan.zhihu.com/p/72085819

七、宏的使用

  • `define

  • `ifdef
    可以跟宏 elsif 一起用
    在这里插入图片描述

  • `ifndef
    跟 ifdef差不多,就是if not的意思

  • `else
    跟ifdef一起用的,如果没有定义宏,那么就执行else内的

  • `endif

  • `include
    插入一个.v的文件进来

八、Package,Generate

1. package

https://blog.csdn.net/Hision_fpgaer/article/details/50909653

2. generate

https://zhuanlan.zhihu.com/p/107047600

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值