generate块内语句是顺序还是并行执行?如何让互依赖模块顺序执行?
Verilog generate块执行规则及依赖模块顺序依赖实现方法
一、generate块的执行逻辑
generate 与 end generate 包裹的所有语句都是并行执行的,不存在软件代码的自上而下顺序执行逻辑:
- generate属于Verilog编译细化阶段的语法,作用是根据参数、循环条件等动态生成对应的硬件电路结构,展开完成后所有生成的硬件单元、赋值语句都是并行运行的,和代码书写顺序无关。
二、generate loop中实现两个依赖模块的顺序依赖方法
你需要的“顺序执行”本质是建立两个模块的依赖关系,分为两种场景实现:
1. 纯组合逻辑依赖(后级模块只需要前级的输出结果作为输入)
- 首先定义适配循环数量的中间信号数组,用于衔接两个模块的输出/输入端口
- 按依赖关系完成端口连接即可:前级模块的输出直接连到中间信号对应位,后级模块的输入连到对应中间信号,硬件路径会天然满足依赖关系,和generate内两个模块的例化顺序无关。
示例代码:
parameter GEN_CNT = 4; // 循环生成的模块组数 // 定义中间信号数组,每组迭代对应一个独立的中间节点 wire [7:0] pre_module_out [0:GEN_CNT-1]; genvar i; generate for(i=0; i<GEN_CNT; i=i+1) begin : dep_module_gen // 例化前置依赖模块 pre_module u_pre( .in(pre_in[i]), .out(pre_module_out[i]) // 输出连接中间信号 ); // 例化后置依赖模块 post_module u_post( .in(pre_module_out[i]), // 输入直接接前级输出的中间信号 .out(post_out[i]) ); end endgenerate
2. 时序逻辑依赖(后级模块需要等前级运算完成后再启动)
除了上述数据端口连接外,额外生成握手/有效指示信号即可:
- 前级模块输出运算完成的
valid信号,连接到后级模块的使能端口 - 后级模块只有在
valid为高时才触发运算,实现时序上的先后执行逻辑。
内容的提问来源于stack exchange,提问作者Harsha
相关产品推荐
相关产品推荐

