2024.1.25-28|总结

写USTC Verilog OJ

目前写到ID612024-01-28T11:21:29.png2024-01-28T11:21:16.png

阅读USTC数字电路实验

看了Lab2实验教程中的第一二章(避免锁存器和编写testbench)

观看视频《从电路设计的角度入门VerilogHDL》

视频介绍了使用的软件工具,电路结构的描述方法,流水线和通过iverilog与gtkwave仿真。链接
生成波形文件:

initial 
begin
$dumpfile("*.vcd");//*代表生成波形的文件名
$dumpvars(0,**);//**代表测试文件名
end

避免生成锁存器

锁存器与触发器区别

锁存器只要使能信号处在特定电平就能改变输出状态,触发器在时钟上升/下降改变状态。

if-else 逻辑缺陷

if与else不完整
if-else语句中,if与else语句完整,但相关信号缺少赋值。如

if (en)
q1 = data1;
else
q2 = data2;

if语句中q1赋值了,但q2没有,else同理。应完整赋值或者赋初值

q1 = 1'b0;
q2 = 1'b0;
if (en)
q1 = data1;
else
q2 = data2;

case 逻辑缺陷

case列表不全,应补全情况或使用default关键字或者赋初值。

// 使用 default 补充逻辑
always @(*) begin
case(sel)
2'b00: q = data1;
2'b01: q = data2;
default: q = 1'b0;
endcase
end

// 枚举补充逻辑
always @(*) begin
case(sel)
2'b00: q = data1;
2'b01: q = data2;
2'b10, 2'b11:
q = 1'b0;
endcase
end

// 使用默认赋值
always @(*) begin
q = 1'b0;
case(sel)
2'b00: q = data1;
2'b01: q = data2;
endcase
end

自赋值与判断

如果一个信号的赋值源头有其信号本身,或者判断条件中有其信号本身的逻辑,也会产生锁存器。因为此时的信号也需要具有存储功能,能够获得先前时刻该信号的数值。
自己作为判断条件

reg a, b;
always @(*) begin
if (a & b)
a = 1'b1; // a 会生成锁存器
else
a = 1'b0;
end

自增

reg a, en;
always @(*) begin
if (en)
a = a + 1; // a 会生成锁存器
else
a = 1'b0;
end

wire与reg变量使用

reg型不等于寄存器。
在always initial中对变量赋值,变量需要是reg型。
assign语句对变量赋值,变量需要是wire型。