Verilog中generate的用法

简介: Verilog中generate的用法

一:generate 在设计中,很多情况下需要编写很多结构相同但是参数不同的赋值语句或者逻辑语句,如果在参数量很大的的情况下,原本的列举就会显得心有余而力不足。c语言中常用for语句来解决此类问题,verilog则为我们提供了generate语句


Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function,continous assignment,initial和always。在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。


generate语法有generate for, genreate if和generate case三种 用法介绍如下: generate for


(1)generate for语句必须有genvar关键字定义for的变量,generate_for用于复制模块;

(2)for 的内容必须加begin和end

(3) 必须给for语段起个名字


generate_if

是根据模块的参数(必须是常量)作为条件判断,来产生满足条件的电路。相当于判断语句。


generate case

generate case分支语句与generate if-条件语句类似,只不过将原来的分支语句换做了case*语句


  1. generate for例子:
`generate
genvar i; //generate 8 samll fifo for in_data[i] 8X72
for(i=0; i<NUM_QUEUES; i=i+1) begin: in_arb_queues //NUM_QUEUES = 8
small_fifo
#( .WIDTH(DATA_WIDTH+CTRL_WIDTH), .MAX_DEPTH_BITS(2))
in_arb_fifo
(// Outputs
.dout ({fifo_out_ctrl[i], fifo_out_data[i]}),
.full (),
.nearly_full (nearly_full[i]),
.prog_full (),
.empty (empty[i]),
// Inputs .din ({in_ctrl[i], in_data[i]}),
.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; end else begin assign new_data_a = merge_update ? {{(REG_WIDTH - WRITE_WIDTH - 1){merge_wr_data_sign}}, merge_wr_data} : {{(REG_WIDTH - WRITE_WIDTH){held_wr_data_sign_a}}, held_wr_data_a}; end endgenerate


3.generate还可以进行多个assign赋值!

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的写法差不多


相关文章
|
机器学习/深度学习 缓存 人工智能
大语言模型中常用的旋转位置编码RoPE详解:为什么它比绝对或相对位置编码更好?
Transformer的基石自2017年后历经变革,2022年RoPE引领NLP新方向,现已被顶级模型如Llama、Llama2等采纳。RoPE融合绝对与相对位置编码优点,解决传统方法的序列长度限制和相对位置表示问题。它通过旋转矩阵对词向量应用角度与位置成正比的旋转,保持向量稳定,保留相对位置信息,适用于长序列处理,提升了模型效率和性能。RoPE的引入开启了Transformer的新篇章,推动了NLP的进展。[[1](https://avoid.overfit.cn/post/9e0d8e7687a94d1ead9aeea65bb2a129)]
3101 0
一把王者的时间,学会generate语句【Verilog高级教程】
一把王者的时间,学会generate语句【Verilog高级教程】
一把王者的时间,学会generate语句【Verilog高级教程】
|
安全 编译器 C语言
MISRA C++ 、Google C++ 、AUTOSAR Adaptive Platform编码 C++ 规范总结
MISRA C++ 、Google C++ 、AUTOSAR Adaptive Platform编码 C++ 规范总结
806 1
|
机器学习/深度学习 编译器
【Verilog】generate和for循环的一些使用总结(2)
【Verilog】generate和for循环的一些使用总结(2)
2969 0
【Verilog】generate和for循环的一些使用总结(2)
浅析PCIe链路LTSSM状态机
我们知道,在PCIe链路可以正常工作之前,需要对PCIe链路进行链路训练,在这个过程中,就会用LTSSM状态机。LTSSM全称是Link Training and Status State Machine。这个状态机在哪里呢?
|
缓存 网络协议 Shell
网络协议格式 | 以太网帧、ARP数据报、IP数据报、UDP数据报、TCP数据报
网络协议格式 | 以太网帧、ARP数据报、IP数据报、UDP数据报、TCP数据报
4134 1
【Verilog】generate和for循环的一些使用总结(1)
【Verilog】generate和for循环的一些使用总结(1)
4655 0
【Verilog】generate和for循环的一些使用总结(1)
|
存储 IDE 开发工具
【毅力挑战】PCIe 每日一问一答(2022.02 归档)
【毅力挑战】PCIe 每日一问一答(2022.02 归档)
6078 1
【毅力挑战】PCIe 每日一问一答(2022.02 归档)
|
存储 缓存 存储控制器
FMC&FSMC
FMC&FSMC
1214 0