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
语句用于描述可用操作符实现的电路元件,常用于描述已有电路图或简单逻辑。写法举例:

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

always_comb block
always_comb
代码块用于描述组合逻辑,常用于描述已知逻辑功能、真值表而无法用门电路描述、难以拆分成模块的电路。always_comb
可视为一个封闭的模块:其有一定的输入和输出,输出为块内所有语句等号左侧的变量;对模块内,所有语句顺序执行,交换语句顺序可能改变结果(assign
语句、元件例化语句、各always_comb
模块间顺序无关);对模块外,其行为相当于运行完最后一句语句后,一次性对外“展示”所有输出。always_comb
描述的行为,由编译器转化为门电路。always_comb
中的变量必须在各个情况下都有值,且不应将输出作为输入。(这条对应的电路是锁存器,应避免)以下介绍一些仅用在
always_comb
或always_ff
中的语句。unique/priority case
case
语句和C语言的switch
类似,用于描述对于某个信号的不同情况,做不同的事
。unique/priority if
if
和case
的作用类似。for循环
for
循环用于复制电路。循环次数必须显式指出(思考:for
循环如何映射到电路?)。和
for
循环相关的语法有break
,continue
,其意义和C语言中的一致。always_ff block
always_ff
适用于D触发器模型。一个最基本的D触发器:
同步复位的D触发器:
异步复位的D触发器:
带时钟使能的D触发器:
状态机、流水线寄存器写法:
always_ff
代码块内应只描述触发器的功能(可带上clock enable
,reset
),次态函数的其他逻辑应在always_comb
中实现。更多的类型
万物皆为
logic
,对编程者来说比较不友好。比如编码和信息,我们希望用不同的类型来标识它们。SystemVerilog
提供了一些语法,使编程者可以拥有更多类型,但本质还是logic
。typedef
struct
enum
enum
多用于编码。union
参数
为了使模块的复用性更高,可以在模块定义时设置参数。
参数被视为常数。
参数可为数值或类型。
Loading...