环境配置
VSCode配置verilog环境(代码提示+自动例化+格式化)_vscode verilog-CSDN博客
基础语法
与软件编程(C、python)不同,Verilog是一门描述语言,代码描述的是电路的基本构成,多个always块、assign语句是并行执行的
模块
// 定义一个名为 and_gate 的模块
module and_gate (
input a, // 输入端口 a
input b, // 输入端口 b
output c // 输出端口 c
);
// 模块内部的逻辑描述
assign c = a & b; // 连续赋值语句,c 等于 a 和 b 的按位与
endmodule // 模块结束
端口定义
输入输出属性(input/output)+类型(默认wire,此外还有reg类型)+变量名称
逻辑描述
变量声明
类型+位宽(默认为1)+变量名称
类型:
- wire:线网类型,代表电路中的物理连接线
- reg:寄存器类型
位宽:[N-1:0]
- 比特矢量:位宽不为1的wire或reg类型
数值
<位宽>'<进制><数字>
位宽可省略不写
进制:b(二进制),o(八进制),d(十进制),h(十六进制)
4'b1010
8'hFF
'HCA
运算符
& (与), | (或), ~ (非), ^ (异或),+ (加), - (减), == (相等),**? :(**条件运算符)
assign
assign out = (sel == 2'b00) ? in0 : in1;
always
当敏感列表中的信号发生变化时,块内的语句就会执行 。
always @(*) begin
if (sel == 1'b1) begin
out = a;
end else begin
out = b;
end
end
-
组合逻辑:@(*)
-
时序逻辑:敏感列表里只有时钟或复位信号
-
posedge clk 时钟的上升沿
-
negedge clk 时钟的下降沿
-
-
阻塞赋值 = 在always块内顺序赋值
-
非阻塞赋值 <= 在always块内并行赋值
Modelsim仿真
用modelsim对Verilog进行仿真_modelsim仿真verilog-CSDN博客
// 示例:测试一个简单的D触发器
module dff_tb;
// 1. 声明信号
reg clk;
reg rst_n;
reg d;
wire q;
// 2. 实例化被测试模块(DUT)
dff u_dut (
.clk(clk),
.rst_n(rst_n),
.d(d),
.q(q)
);
// 3. 生成时钟
initial begin
clk = 0;
forever #10 clk = ~clk; // 20ns周期时钟
end
// 4. 测试序列
initial begin
// 初始化信号
rst_n = 0;
d = 0;
// 复位释放
#20 rst_n = 1;
// 测试数据输入
#20 d = 1;
#20 d = 0;
#20 d = 1;
// 仿真运行一段时间后停止
#100 $finish;
end
// 5. 监控输出
initial begin
$monitor("Time=%t, rst_n=%b, d=%b, q=%b",
$time, rst_n, d, q);
end
// 6. 生成波形文件(可选)
initial begin
$dumpfile("wave.vcd");
$dumpvars(0, dff_tb);
end
endmodule