一:generate 的作用
1)構造循環結構,用來多次實例化某個模塊
2)構造條件generate結構,用來在多個塊之間最多選擇一個代碼塊,條件generate結構包含if--generate結構和case--generate形式。
3) 斷言
generate 循環結構
generate循環的語法與for循環語句的語法很相似。但是在使用時必須先在genvar聲明中聲明循環中使用的索引變量名,然后才能使用它。genvar聲明的索引變量被用作整數用來判斷generate循環。genvar聲明可以是generate結構的內部或外部區域,並且相同的循環索引變量可以在多個generate循環中,只要這些環不嵌套。genvar只有在建模的時候才會出現,在仿真時就已經消失了。
在“展開”生成循環的每個實例中,將創建一個隱式localparam,其名稱和類型與循環索引變量相同。它的值是“展開”循環的特定實例的“索引”。可以從RTL引用此localparam以控制生成的代碼,甚至可以由分層引用來引用。Verilog中generate循環中的generate塊可以命名也可以不命名。如果已命名,則會創建一個generate塊實例數組。如果未命名,則有些仿真工具會出現警告,因此,最好始終對它們進行命名。
module alu( input a,b, output sum,count); assign sum = a + b ; assign cout = a & b ; endmodule module my_design #(parameter N=4) (input [N-1:0] a,b, output [N-1:0] sum,cout); genvar i ; generate (optional) for( i = 0 ; i < N ; i++) begin: gen alu alu_inst (a[i] , b[i] , sum[i] , cout[i] ); end endgenerate endmodule
二、prameter 作用
Verilog中通過使用parameter可以在調用模塊時修改模塊里面的常數參數,提高模塊的復用性,在模塊調用時將參數傳入模塊。
以一個二選一MUX(選擇器)為例
module Mux2_1 #(parameter WIDTH=2) (in1,in2,sel,out); //parameter WIDTH=2; input[WIDTH-1:0] in1; input[WIDTH-1:0] in2; input sel; output[WIDTH-1:0] out; assign out=sel?in1:in2; endmodule
頂層模塊在調用Mux2_1時,可以在外部修改參數
module ParaDemo(in1,in2,sel,out); parameter WIDTH=4; input[WIDTH-1:0] in1; input[WIDTH-1:0] in2; input sel; output [WIDTH-1:0] out;
Mux2_1 #(WIDTH) //此時Mux2_1中WIDTH值=4
u_mux2_1(
.in1(in1),
.in2(in2),
.sel(sel),
.out(out));
endmodule
如果是一個計數器模塊,要對參數化的信號count進行復位和+1的賦值操作,位寬聲明如下:
module counter #(parameter WIDTH=16) ( clk,rst_n,count) input clk; input rst_n; output[WIDTH-1:0] count; always@(posedge clk or negedge rst_n)begin if(!rst_n) count<= 0; //賦0語句 或count<=‘b0 ‘之前不需要帶位寬; 如果要賦全1: count <= -1; else count <= count + {(WIDTH-1){1'b0},{1'b1}}; end endmodule