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...