Verilog 核心要点速览
所有行为代码写在 module 和 endmodule 内。无论打算创建什么数字设计,都放在 module 块中。可定义端口允许信号作为 input 进入或作为 output 离开。
模块
下面空模块叫 testbench。命名随意,但须字母数字且可含下划线 _。
module testbench;
endmodule
再看另一模块。有几个信号 (d, clk, rstb) 声明为输入,q 声明为输出。
module dff (input d, clk, rstb, output q);
endmodule
数据类型
看过模块样子,再看模块内可放什么,以 testbench 模块为例。Verilog 主要两种数据类型:
- reg
- wire
reg 数据类型用于保持值如变量,而 wire 类似电线,必须持续驱动。通常 wire 用于连接多个模块和其他信号。
module testbench;
reg d;
reg rst_b;
reg clk;
wire q;
endmodule
赋值
Verilog 有三大基本块:
always @ (condition) | 条件满足时总是执行 |
initial | 仿真开始时仅执行一次 |
assign [LHS] = [RHS] | RHS 变化时 LHS 更新 |
编写 Verilog 需牢记几条规则:
reg只能在initial和always块中赋值wire只能通过assign语句赋值- initial/always 块有多条语句时须用
begin .. end包裹
module testbench;
reg d;
reg rst_b;
reg clk;
wire q;
initial begin
d = 0;
rst_b = 0;
clk = 0;
#100 $finish;
end
always begin
#10 clk = ~clk;
end
endmodule
注意上例:
initial块多行故用 begin 和 end- 信号
d、rst_b、clk在 initial 块赋值,因它们是reg类型 - initial 块内代码在 0ns 即仿真开始时执行
always块无条件将像 C 语言无限循环- # 表示时间延迟。#10 告诉仿真器推进 10 时间单位
clk = ~clk;翻转时钟值,因前有 #10,时钟每 10 时间单位翻转一次$finish结束仿真。本例运行 100 时间单位后退出
Verilog
- Verilog 入门:数字电路设计完整教程
- 掌握 Verilog 拼接操作:实用指南
- 深入理解 Verilog 赋值语句:类型、语法与最佳实践
- Verilog阻塞与非阻塞赋值:关键区别详解
- 掌握Verilog函数:高效RTL设计的复用利器
- 理解Verilog任务:函数vs任务、语法与用法全解析
- 掌握 Verilog 层次引用作用域:避免模块与块中的名称冲突
- Verilog 时钟发生器设计与实现指南
- 掌握 Verilog 数学函数:高效硬件设计的利器
- 掌握 Verilog $timeformat:精度控制与显示格式化
- 理解与打印 Verilog 任意作用域下的 Timescale
- 掌握 Verilog 文件 I/O:打开、读取、写入和关闭