写USTC Verilog OJ

目前写到ID61

2024-01-28T11:21:29.png
2024-01-28T11:21:29.png
2024-01-28T11:21:16.png
2024-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型。