generate block的使用
资料来源
(1) Verilog系列:【2】generate常用用法 (qq.com)
1.1 generate block作用与语法
(1) 作用:写出可配置可综合的RTL,主要用于重复性实例化模块或者有条件地实例化模块;
注1:generate语句在解析阶段对某些语句进行选取或者重复,这些语句可以包括模块实例语句、连续赋值语句、always语句、initial语句和门级实例语句等;
(2) 语法:由generate和endgenerate构成.一个verilog generate模块创建了一个新的层次,就像实例化了一个模块一样.
注1:使用genvar作为generate语句块的循环变量;
(3) 使用:generate中除了port声明, specify和specparam不能使用外,module中可以使用的所有元素都可以用于generate中(generate不能用于initial begin...end块中,但是initial begin...end块可以用于generate中);
1.2 generate语句块的处理
(1) generate语句在仿真/综合的elaborate阶段进行分析,该步骤位于HDL语言解析之后,在仿真/综合之前.因此generate结构中所包含的所有表达式在elaborate的时候需要是确定的表达式,不能包含动态变量.比如,generate中的语句可以受parameter影响,但不能受动态变量影响.
1.3 generate语句结构
主要包含两类: (1) generate loop; (2)conditional generate;
1.3.1 generate loop
(1) 将一段代码例化多次,通过一个index变量来控制; index变量要先用genvar关键字来定义,genvar所定义的index变量会被用在elaboration中. genvar可以存在于generate region(由generate-endgenerate关键字来限定)之内或之外.同一个genvar定义的index可以被用在多个generate loop中,只要这些loop没有相互嵌套.
1.3.2 generate loop code示例
1.3.3 conditional generate(需要补充例子)
在多段代码中选择一段进行例化. conditional generate包括if-generate和case-generate两种不同模式.
(1) if-generate从一组互斥的generate block中最多选择一个generate block.
(2) case-generate从一组互斥的generate block中选择一个generate block.用法同传统的case语句.
1.4 generate block naming
(1) 显式命名:推荐给generate block显式命名.
(2) 隐式命名:同一个scope中的每个generate block都被赋予一个数字,从1开始,这个数字对于命名和未命名的generate block都存在,依其在rtl code中出现的顺序而定. 所有未命名 的block都会被取一个叫genblk[n]的名字,n就是被赋予的数字.