业精于勤荒于嬉,行成于思毁于随。
学无止尽~
小白常犯错误整理
Question1: input/output端口定义
对于设计模块而言:
input 的数据类型必须是wire,
output的数据可以是wire也可以是reg。
对于TESTBENCH仿真而言
module tb_my_module;
// 声明与 DUT 接口对应的信号
reg clk;
reg rst_n;
reg [7:0] data_in;
wire [7:0] data_out;
wire valid;
// 实例化 DUT
my_module uut (
.clk (clk),
.rst_n (rst_n),
.data_in (data_in),
.data_out(data_out),
.valid (valid)
);
// 激励生成部分
initial begin
clk = 0;
rst_n = 0;
#10 rst_n = 1;
data_in = 8'h55;
#20 data_in = 8'haa;
#100 $finish;
end
// 时钟生成
always #5 clk = ~clk;
// 监控输出
initial begin
$monitor("Time=%0t: data_out=%h, valid=%b", $time, data_out, valid);
end
endmodule
输入端口(input) → 在 TestBench 中声明为 reg
因为这些信号是由 TestBench 驱动的,需要赋值或产生激励波形,所以必须是 reg
类型。
当然,如果你觉得麻烦就用system verilog的数据类型logic
输出端口(output)→ 在 TestBench 中声明为 wire
因为这些信号是由 DUT 驱动的,TestBench 只能观测,不能赋值,因此使用 wire
类型。
Question2: 按位与和缩位
按位与
reg[1:0] a=2'b11
reg[1:0] b= 2'b10;
reg[1:0] c;
reg d;
c= a&b; 按位与操作,最终结果c=2'b10;
缩位
d = | c; // c =2'b10,最终d的结果是1.
(补充说明一下)
比如说:按位同或(~^或^~)
2个多位操作数按位进行同或运算,各位的结果按顺序组成一个新的多位数。例如,a=2'b10,b=2'b11,则a^~b的结果为2'b10;(相同为1,不同为0)
缩减操作都是对于一个对象而言 ,这里说的对象,不是男女关系的那种意思,我是说对于一个操作数而言。或者说对一个多比特信号进行操作的,包括以下几种:
缩减与(&):
对一个多位操作数进行缩减与操作,先将它的最高位与次高位进行与操作,其结果再与第二次高位进行与操作,直到最低位。例如,&(4'b1011)的结果为0;
Question3:parameter和localparam
parameter:
本module内有效的定义,可用于参数传递;
localparam:
只能在模块内部声明;
(不推荐使用defparam,仿真会失败!)
Question4:阻塞与非阻塞
阻塞:'='
等等我,你先计算,然后把结果给我,我等你。风险:竞争冒险。
适用于组合逻辑。
非阻塞:'<='
拍一张快照,拿到寄存器的当前值,开干。
适用于时序逻辑。
Question5:语法乱来
assign语句不能用在initial中。
Question6:边沿检测
首先我们要确认一件事情。

检测上升沿(~D[1])&&(D[0])
这是一个上升沿没有问题,对吧。

检查下降沿(D[1])&&(~D[0])
这是一个下降沿,对吧。
reg [1:0] D;
D<= {D[0],data};
对于这个寄存器而言,D[1]就是前一时刻,跑的快,D[0]就是后一时刻,所以在图上看就在后面。

Question7:assign和always的用法
assign
用于描述组合逻辑,表示信号之间的连续关系。
特点:
- 只能用于
wire
类型信号 - 右侧表达式变化时立即更新左侧
- 不能包含时序控制(如延迟)
- 适合简单的组合逻辑

always 块可以描述组合逻辑或时序逻辑,取决于敏感列表。
(1) 组合逻辑 always
块
组合逻辑 always 块
特点:
- 敏感列表使用
@(*)
或列出所有输入信号 - 块内赋值使用阻塞赋值
=
- 必须对所有可能的输入组合给出输出(避免锁存器)
(2) 时序逻辑 always
块
特点:
• 敏感列表包含时钟边沿(posedge/negedge)
• 块内赋值使用非阻塞赋值 <=
• 可以描述寄存器、状态机等时序逻辑
补充说明:verilog规定assign中的赋值目标必须是wire型的,而always语句中的赋值目标
必须是reg型的。
(持续更新)