04 SystemVerilog语法简介

AI summary
SystemVerilog语法包括变量(如logic)、常量、操作符、assign语句、模块和元件例化、always_comb和always_ff代码块等。它支持组合逻辑和时序逻辑的描述,提供了typedef、struct、enum和union等类型定义,允许模块参数化以提高复用性。
Tags
SystemVerilog
Hardware Description
Digital Logic

SystemVerilog语法简介

[TOC]

变量

SystemVerilog基本变量为logic。万物皆为 logic
SystemVerilog的每个变量对应着电路中的一个节点。
变量有一位的,也有向量类型。

常量

SystemVerilog的常量为若干位0和1的组合。

操作符

每个操作符对应一个逻辑门或数字模块。
操作符
对应电路元件
备注
&
与门
有缩位的用法
`
`
或门
~
非门
+
加法器
-
减法器
*
单周期乘法器
输出位数为输入的两倍
/
单周期除法器
><等比较符号
比较器
有一个操作数含X时,结果未知
<<>>>>>
移位器(多种实现)
右操作数的位数应为左操作数位数的对数
? :
二选一选择器
++
几乎仅在for循环中使用,无对应电路元件
{}
位绑定或扩位
位绑定或扩位
无操作符
电路直接连线
等号左右两边对应同一节点

assign语句

assign语句用于描述可用操作符实现的电路元件,常用于描述已有电路图或简单逻辑。
写法举例:
notion image

模块、元件例化

module是电路设计中很重要的概念,可封装逻辑细节,只暴露接口。
  • 在多人协作中,每人写一些模块,可确保每个人写的逻辑独立,也方便拼接。
  • 想实现某个功能但写不出电路时,可以先放一个元件,把接口定好,等宏观的电路结构搭好后再实现细节。
模块和元件类似于c++中的类与对象的概念。
元件例化用于描述电路图中的抽象逻辑部件,常用于描述已有电路图。
写法举例:
notion image

always_comb block

always_comb代码块用于描述组合逻辑,常用于描述已知逻辑功能、真值表而无法用门电路描述、难以拆分成模块的电路。
always_comb可视为一个封闭的模块:其有一定的输入和输出,输出为块内所有语句等号左侧的变量;对模块内,所有语句顺序执行,交换语句顺序可能改变结果(assign语句、元件例化语句、各always_comb模块间顺序无关);对模块外,其行为相当于运行完最后一句语句后,一次性对外“展示”所有输出。
always_comb描述的行为,由编译器转化为门电路。
always_comb中的变量必须在各个情况下都有值,且不应将输出作为输入。(这条对应的电路是锁存器,应避免)
以下介绍一些仅用在always_combalways_ff中的语句。

unique/priority case

case语句和C语言的switch类似,用于描述对于某个信号的不同情况,做不同的事

unique/priority if

ifcase的作用类似。

for循环

for循环用于复制电路。循环次数必须显式指出(思考:for循环如何映射到电路?)。
for循环相关的语法有breakcontinue,其意义和C语言中的一致。

always_ff block

always_ff适用于D触发器模型。
一个最基本的D触发器:
同步复位的D触发器:
异步复位的D触发器:
带时钟使能的D触发器:
状态机、流水线寄存器写法:
always_ff代码块内应只描述触发器的功能(可带上clock enablereset),次态函数的其他逻辑应在always_comb中实现。

更多的类型

万物皆为logic,对编程者来说比较不友好。比如编码和信息,我们希望用不同的类型来标识它们。
SystemVerilog提供了一些语法,使编程者可以拥有更多类型,但本质还是logic

typedef

struct

enum

enum多用于编码。

union

参数

为了使模块的复用性更高,可以在模块定义时设置参数。
参数被视为常数。
参数可为数值或类型。
Loading...