Verilog中generate的用法

2021-06-18 16:17:52 字數 2950 閱讀 7080

一:generate

verilog-2001新增了generate迴圈,允許產生module和primitive的多個例項化,同時也可以產生多個variable,net,task,function,continous assignment,initial和always。在generate語句中可以引入if-else和case語句,根據條件不同產生不同的例項化。

用法:1. generate語法有generate for, genreate if和generate case三種

2. generate for語句必須有genvar關鍵字定義for的變數

3. for 的內容必須加begin和end

4. 必須給for語段起個名字

例子:1. generate for例子:

generate

genvar i; //generate 8 samll fifo for in_data[i] 8x72

for(i=0; ismall_fifo

#( .width(data_width+ctrl_width),

.max_depth_bits(2))

in_arb_fifo

(// outputs

.dout (),

.full (),

.nearly_full (nearly_full[i]),

.prog_full (),

.empty (empty[i]),

// inputs

.din (),

.wr_en (in_wr[i]),

.rd_en (rd_en[i]),

.reset (reset),

.clk (clk));

end // block: in_arb_queues

endgenerate

2.generate if例子:

generate

if (reg_width == write_width) begin : new_data_a_generation

assign new_data_a = merge_update ? merge_wr_data : held_wr_data_a;

endelse begin

assign new_data_a = merge_update ?

}, merge_wr_data} :

}, held_wr_data_a};

endendgenerate

3.generate還可以進行多個assign賦值!

module anytest_v(

input clk,

input[7:0] datain,

output[7:0] dataout,

output finish

);wire[7:0] mem[31:0];

wire[32*8-1:0] ***;

//reg[7:0] i;

generate

genvar i;

for(i=0;i<=31;i=i+1)

begin :wiertech

assign mem[i]= 8'b0;

endendgenerate

endmodule

ps: 對於a[8*i+:8]

this is the so-called "indexed vector part selects"

在verilog-1995中,可以選擇向量的任一位輸出,也可以選擇向量的連續幾位輸出,不過此時連續幾位的始末數值的index需要是常量。而在verilog-2001中,可以用變數作為index,進行part select。

[base_expr +: width_expr] //positive offset

[base_expr -: width_expr] //negative offset

其中base_expr可以是變數,而width_expr必須是常量。+:表示由base_expr向上增長width_expr位,-:表示由base_expr向上遞減width_expr位。例如:

reg [63:0] word;

reg [3:0] byte_num; //a value from 0 to 7

wire [7:0] byten = word[byte_num*8 +: 8];

如果byte_num的值為4,則word[39:32]賦值給byten

二、引數傳遞

類似vhdl的generic語句,verilog也可以在例化時傳遞引數

傳遞的引數是子模組中定義的parameter。

傳遞的方法:

1、module_name #( parameter1, parameter2) inst_name( port_map);

2、module_name #( .parameter_name(para_value), .parameter_name(para_value)) inst_name (port map);

用#方法和port map的寫法差不多

module multiplier (a, b, product);

parameter a_width = 8, b_width = 8;

localparam product_width = a_width+b_width;

input [a_width-1:0] a;

input [b_width-1:0] b;

output[product_width-1:0]product;

generate

if((a_width < 8) || (b_width < 8))

cla_multiplier #(a_width, b_width) u1 (a, b, product);

else

wallace_multiplier #(a_width, b_width) u1 (a, b, product);

endgenerate

endmodule

Verilog中的函式

verilog中的函式 verilog hdl與大多數可程式語言一樣,將使用率很高的 按照軟體工程的思想,寫成函式,這樣,該函式可以被多次呼叫。verilog中函式常用語三種情況 verilog中的函式與c語言中的函式的主要不同之處是 在verilog中,呼叫函式時,需要將乙個或則多個自變數傳給函式...

Python學習筆記 生成器(Generator)

python學習筆記 生成器 generator 擁有迭代序列的一致方式,比如列表裡的物件或檔案裡的行,是python的一項重要特性。這是通過迭代器協議的方式來完成的,一種生成可迭代物件的通用方式。例如,迭代乙個字典會生成字典鍵構成的集合。當我們書寫for key in mydict語句時,pyth...

verilog中的task用法

定義乙個任務。task task demo 任務定義結構開頭,命名為 task demo input 7 0 x,y 輸入埠說明 output 7 0 tmp 輸出埠說明 if x y 給出任務定義的描述語句 tmp x else tmp y endtask 上述 定義了乙個名為 task demo...