Quiet
  • 主页
  • 归档
  • 分类
  • 标签
  • 链接
  • 关于我

bajiu

  • 主页
  • 归档
  • 分类
  • 标签
  • 链接
  • 关于我
Quiet主题
  • FPGA

Verilog基础语法地图(二)

bajiu
FPGA

2025-05-22 21:17:00

下面把 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

下节我们基于上面的地图逐个开始编写代码~

下一篇

FPGA基础知识 (一)

©2025 By bajiu.