下面把 FPGA 开发常用的 Verilog-2001 / SystemVerilog 关键字与语法要素 按功能分了 8 个板块,每条语法点都写了 作用 + 一眼能懂的小例子
1. 模块与层次结构
关键词/符号 |
作用 |
例子 |
module … endmodule |
定义一块逻辑的最小单元 |
module alu (input [3:0] a,b, output [3:0] y); … endmodule |
input output inout |
声明端口方向 |
input clk; output reg done; |
parameter / localparam |
给模块设常量,便于复用和约束 |
parameter WIDTH = 8; |
defparam (很旧,不推荐) |
实例化时临时改参数 |
defparam u1.WIDTH = 16; |
练习:写一个带 parameter WIDTH=8
的计数器,用不同 WIDTH 实例化两次,看仿真波形是否宽度可变。
2. 数据类型与信号
关键词/符号 |
作用 |
例子 |
wire |
连线型,连续赋值;默认 1 位 |
wire sum; assign sum = a ^ b; |
reg |
过程块中保存值(综合后可能是锁存/触发器) |
reg [7:0] cnt; |
integer , time |
仿真用的整数/时间变量 |
integer i; time t; |
logic (SystemVerilog) |
统一取代 reg /wire ,语义更清晰 |
logic [15:0] data; |
3. 赋值机制
语法 |
什么时候用 |
例子 |
连续赋值 assign wire = expr; |
组合逻辑;被赋对象必须是 net 类型 |
assign y = a & b; |
阻塞赋值 = |
过程块里组合逻辑建模 |
always @* begin y = a & b; z = y ^ c; end |
非阻塞赋值 <= |
时序逻辑(寄存器)建模,保持并行 |
always @(posedge clk) q <= d; |
口诀:“组合 =,时序 <=” —— 以后写错仿真跑得动但上板会炸。
4. 过程块与控制结构
关键词 |
作用 |
例子 |
always @(posedge clk or negedge rst_n) |
描述寄存器、状态机 |
if(!rst_n) state <= IDLE; |
always @* / always_comb |
描述纯组合逻辑(自动生成敏感表) |
always_comb y = a + b; |
initial |
仿真初始化 |
initial $display("Start"); |
if…else , case , casez , casex |
分支 |
case(state) IDLE: … |
for , repeat , while , forever |
循环/测试台生成流 |
for(i=0;i<8;i=i+1) $write("%b",mem[i]); |
disable , wait , #10 |
过程控制/延时(仿真) |
#5 clk = ~clk; |
5. 层次实例化与可参数化生成
关键词 |
用途 |
例子 |
实例名 u_x (.port(sig)) |
复用子模块 |
fifo #(.DEPTH(16)) u_fifo (.*); |
generate … endgenerate |
条件/循环生成硬件 |
generate for(genvar i=0;i<4;i++) begin: g add16 u (…); end endgenerate |
genvar |
生成块控制变量 |
同上 |
6. 布尔与门级原语(了解即可)
关键词 |
示例 |
and , or , nand , nor , xor , xnor , buf , not |
and #(2) u1 (y, a, b); // 2ns 延迟 |
现代 FPGA 很少手写门级;合成器会把 RTL 优化成 LUT/FF。
7. 编译指令 & 系统任务(仿真调试必会)
语法 |
用途 |
例子 |
define / ifdef |
条件编译 |
``` `define USE_SIM`` |
$display , $monitor , $stop , $finish |
打印 / 结束仿真 |
$display("cnt=%d", cnt); |
$readmemh , $readmemb |
ROM/内存初始化 |
$readmemh("init.txt", mem); |
8. SystemVerilog 扩展(多数 FPGA 工具已支持,建议尽早用,虽然感觉是高级功能)
关键词 |
亮点 |
1-行示例 |
enum {IDLE, BUSY, DONE} state_t; |
类型安全的状态机 |
state_t state; |
typedef struct packed {logic [7:0] data; logic valid;} bus_t; |
结构体封装总线 |
bus_t in, out; |
interface |
统一端口、放协议 |
interface axi_if (input clk); logic [31:0] addr; … endinterface |
always_ff , always_latch |
明确意图,工具能检查 |
always_ff @(posedge clk) q <= d; |
package , import |
可重用库 |
package cfg_pkg; parameter int WIDTH=32; endpackage |
下节我们基于上面的地图逐个开始编写代码~