Verilog 是一种硬件描述语言(HDL),用于描述和设计数字电路。下面是 Verilog 的常用语法和关键概念:
1. Verilog 设计结构
Verilog 代码通常由 模块(module) 组成,每个模块表示一个硬件单元,具有输入和输出端口。
verilog
module and_gate (
input wire a, // 输入信号 a
input wire b, // 输入信号 b
output wire y // 输出信号 y
);
assign y = a & b; // 逻辑与操作
endmodule
module
定义一个模块input
/output
定义输入输出端口assign
进行组合逻辑赋值
2. 变量类型
Verilog 变量用于存储信号值,常见变量类型:
wire
------ 组合逻辑信号(无存储能力)reg
------ 触发器存储信号(用于时序逻辑)integer
------ 存储整数(常用于循环变量)
示例:
verilog
wire a, b, y; // 组合逻辑信号
reg clk, rst; // 时序信号
integer i; // 整数变量
3. 组合逻辑
组合逻辑直接由输入信号决定输出信号,不依赖时钟。
3.1 assign
语句
verilog
assign y = a & b; // 逻辑与运算
assign s = a ^ b; // 异或运算
assign c = (a & b) | (b & c_in) | (a & c_in); // 组合逻辑表达式
3.2 always @(*)
组合逻辑块
verilog
always @(*) begin
y = a & b; // 组合逻辑
end
4. 时序逻辑
时序逻辑依赖时钟信号,通常使用 always @(posedge clk)
定义。
verilog
always @(posedge clk or negedge rst) begin
if (!rst)
q <= 0; // 复位
else
q <= d; // D 触发器
end
posedge clk
表示在 时钟上升沿 触发negedge rst
表示 复位信号下降沿 触发<=
非阻塞赋值(用于寄存器存储)
5. 条件语句
5.1 if-else
语句
verilog
always @(posedge clk) begin
if (a == 1'b1)
y <= 1'b1;
else
y <= 1'b0;
end
5.2 case
语句
verilog
always @(posedge clk) begin
case (sel)
2'b00: y <= a;
2'b01: y <= b;
2'b10: y <= c;
default: y <= 0;
endcase
end
6. 循环结构
6.1 for
循环
verilog
integer i;
always @(posedge clk) begin
for (i = 0; i < 8; i = i + 1) begin
mem[i] <= data[i];
end
end
6.2 while
循环
verilog
integer i = 0;
always @(posedge clk) begin
while (i < 8) begin
mem[i] <= data[i];
i = i + 1;
end
end
7. 进程间通信
7.1 initial
语句
initial
语句在仿真时执行一次,常用于仿真测试。
verilog
initial begin
a = 0; b = 1;
#10 a = 1; // 10 时间单位后 a 变为 1
#20 b = 0; // 20 时间单位后 b 变为 0
end
7.2 always
语句
verilog
always @(posedge clk) begin
y <= a & b;
end
8. 任务和函数
8.1 task
任务
任务 task
可以有多个输入输出参数:
verilog
task add;
input a, b;
output sum;
begin
sum = a + b;
end
endtask
8.2 function
函数
function
只能返回一个值:
verilog
function [3:0] add;
input [3:0] a, b;
add = a + b;
endfunction
9. 测试平台(Testbench)
测试平台 用于验证 Verilog 设计的正确性。
verilog
module testbench;
reg a, b;
wire y;
and_gate uut (.a(a), .b(b), .y(y)); // 连接被测模块
initial begin
a = 0; b = 0;
#10 a = 1;
#10 b = 1;
#10 a = 0; b = 0;
#10 $stop; // 结束仿真
end
endmodule
10. 关键语法总结
语法 | 说明 | 示例 |
---|---|---|
module |
定义模块 | module my_module(); ... endmodule |
input / output |
端口定义 | input a, b; output y; |
wire |
组合逻辑信号 | wire a, b, y; |
reg |
时序逻辑信号 | reg clk, rst; |
assign |
组合逻辑赋值 | assign y = a & b; |
always @(*) |
组合逻辑块 | always @(*) y = a & b; |
always @(posedge clk) |
时序逻辑块 | always @(posedge clk) q <= d; |
if-else |
条件判断 | if (a) y = 1; else y = 0; |
case |
多路选择 | case(sel) 2'b00: y = a; endcase |
for |
循环 | for (i = 0; i < 8; i = i + 1) |
task |
任务 | task add(input a, b, output sum); |
function |
函数 | function [3:0] add(input [3:0] a, b); |
initial |
初始化块 | initial begin a = 0; #10 a = 1; end |
总结
- Verilog 是硬件描述语言(HDL),主要用于 FPGA/ASIC 设计。
- 使用
module
组织代码,每个模块表示一个硬件单元。 wire
表示组合逻辑,reg
表示寄存器存储。- 组合逻辑使用
assign
或always @(*)
,时序逻辑使用always @(posedge clk)
。 - 支持
if-else
、case
、for
等控制结构。 initial
用于仿真,always
用于时序逻辑。task
和function
提供代码复用能力。- 测试平台
testbench
用于验证设计。