對於數據流建模和行為級建模的梳理(重點)


  • 數據流建模,輸入輸出的類型一般為wire
  • 行為級建模,輸入的類型一般為reg,輸出的類型為wire,因為always其中的等號左邊的式子的值必須是reg類型的
//數據流建模
module and2(x1, x2, z1);
    input x1, x2;
    output z1;
    wire x1, x2;
    wire z1;
    assign z1 = x1 & x2;
endmodule
//行為級建模
module or3(
    x1,
    x2,
    x3,
    z1
    );
    input x1, x2, x3;
    output z1;
    
    wire x1, x2 , x3;
    reg z1;
    always @ (x1 or x2 or x3)   // always的變量z1必須為reg類型的
        begin
            z1 = x1 | x2 | x3;
        end        
endmodule

從上面也能看出:

  • 數據流建模,一般用assign聲明描述電路行為(連續賦值語句。因此這里的輸出必須設置成wire類型)
  • 行為級建模,一般用initial 或者always (過程連續賦值語句,因為這里有always,輸出必須設置成reg類型的)

 

在testbench中,輸入是reg類型,輸出是wire類型:

//這里有for循環類型的
module or3_tb;

reg x1, x2, x3;
wire z1;
initial
begin : apply_stimulus
    reg [3:0] invec;
    for(invec = 0; invec < 8; invec = invec + 1)
        begin
            {x1, x2 ,x3} = invec [3:0];
            #10 $display ("x1x2x3 = %b , z1 = %b ",{x1, x2, x3}, z1);
         end
end
or3 inst(
    .x1(x1),
    .x2(x2),
    .x3(x3),
    .z1(z1)
);         
endmodule
//類似於 枚舉類型的
module add_tb;
reg  x1, x2;
wire z1;
//diaplay variables
initial
$monitor ("x1 = %b, x2 = %b, z1 = %b", x1, x2, z1);
//applay
initial
begin
#0      x1 = 1'b0;
        x2 = 1'b0;
#10     x1 = 1'b0;
        x2 = 1'b1;
#10     x1 = 1'b1;
        x2 = 1'b0;
#10     x1 = 1'b1;
        x2 = 1'b1;
#10     $stop;
end

add ins(
    .x1(x1),
    .x2(x2),
    .z1(z1)
);                                     
endmodule

當然還有其它類型


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM