日常记录(22)代码书写

代码书写

以下是一个乘法器实现(非设计,for循环不对),其中task的tmp指明了16位长度,用于存储移位后的结果。另外注意tmp需要为16位,否则存储结果会被截断。

如果直接q = q + p1<<i;则输出结果错误,需要括号q = q +( p1<<i);。

module mul ();
reg[15:0] q;
reg[7:0] p1, p2;

initial begin
    mul_task(q, p1, p2);
    # 10 p1=5;p2=6;
    mul_task(q, p1, p2);
    # 85 p1=5;p2=111;
    mul_task(q, p1, p2);
    # 10 p1=123;
    mul_task(q, p1, p2);
    # 10 $finish;
    end

initial begin
    $monitor("@%t, input p1 %d, p2 %d, output q %d", $time, p1, p2, q);
end

task automatic mul_task;
    output reg[15:0] q;
    input [7:0] p1, p2;
    integer i;
    reg [15:0] tmp;
    begin
        q=0;
        for(i=0;i<8;i=i+1) begin
            tmp=p1<<i;
            if(p2[i]==1)
                q = q + tmp;
        end
        # 10 q = q;
    end

endtask

reg [7:0] tx;
initial begin
    tx=8'b10110011;
    # 10 tx=tx<<1;
    # 5 tx=tx>>1;
end

initial begin
    //$monitor("tx is %b", tx);
    ;
end



endmodule

结果:

@                   0, input p1   x, p2   x, output q     x
@                  10, input p1   x, p2   x, output q     0
@                  20, input p1   5, p2   6, output q     0
@                  30, input p1   5, p2   6, output q    30
@                 115, input p1   5, p2 111, output q    30
@                 125, input p1   5, p2 111, output q   555
@                 135, input p1 123, p2 111, output q   555
@                 145, input p1 123, p2 111, output q 13653
$finish called from file "mul.v", line 13.
$finish at simulation time                  155

  

<<和+的优先级

加法的优先级高于移位运算

https://blog.csdn.net/gsjthxy/article/details/108983326

 

 

 例子:

module ssx ();
    integer a=1;
    integer b=1;
    initial begin
        int c = a + b <<1;
        int d = a + (b <<1);
        $display("value c %0d", c);
        $display("value d %0d", d);
    end
endmodule

输出:

value c 4
value d 3

 

模拟延时

延时分为上升,下降,关断延时。

每个部分分为:最小值:典型值:最大值

门级和数据流级的延时称为惯性延时,另外一种延时为传输延时,在行为级建模上定义。

惯性延时在小于建立保持时间的时候,输出就被覆盖掉。传输延时会延时一定时间在输出端。

`timescale 1ns/1ns

wire ans;
reg a, b;

initial begin
    a=1; b=0;
    #10 
    a=1; b=1;
    #10
    a=0; b=0;
    #10
    a=1; b=1;
    #10
    a=1; b=0;
    #10
    a=0; b=0;
    #10
    a=1'bx; b=0;
    #10
    a=1'bx; b=1'bx;
    #10
    a=1'bz; b=1'bz;
    #100 $finish;
end

nand #(1:2:3, 3:5:6, 6) n1(ans, a, b);

initial begin
    $monitor("@%0t input %b , %b, output %b",$realtime,  a, b, ans);
end
endmodule

输出:

输入以后,输出值的变化会根据典型值的延时发生。

@0 input 1 , 0, output x
@2 input 1 , 0, output 1
@10 input 1 , 1, output 1
@15 input 1 , 1, output 0
@20 input 0 , 0, output 0
@22 input 0 , 0, output 1
@30 input 1 , 1, output 1
@35 input 1 , 1, output 0
@40 input 1 , 0, output 0
@42 input 1 , 0, output 1
@50 input 0 , 0, output 1
@60 input x , 0, output 1
@70 input x , x, output 1
@72 input x , x, output x
@80 input z , z, output x
$finish called from file "delayt.v", line 31.
$finish at simulation time                  180

  

posted @ 2021-12-27 11:06  大浪淘沙、  阅读(57)  评论(0)    收藏  举报