写USTC Verilog OJ
目前写到ID61
阅读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型。