1. 程式人生 > 其它 >日常記錄(22)程式碼書寫

日常記錄(22)程式碼書寫

程式碼書寫

以下是一個乘法器設計,其中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://www.cnblogs.com/bai2022/p/15735510.html