- 數據流建模,輸入輸出的類型一般為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
當然還有其它類型