如何不借助工具从Verilog代码判断综合生成的触发器数量?
手动分析Verilog代码综合后的触发器数量
要手动算出Verilog代码综合后生成的触发器数量,核心看两个关键点:
- 触发器只来自时序逻辑块——也就是带时钟沿敏感列表的
always_ff(或者传统写法always @(posedge clk ...))块,组合逻辑块(比如always_comb)不会生成触发器。 - 在时序块里,只有被**非阻塞赋值(
<=)**的信号,或者在块内同步更新的输出信号,每一位都会对应一个触发器(默认综合工具不做额外优化的前提下)。
实例1:生成5个触发器的代码
module regdesp (PL, RST, ENSERIE, CLOCK, ENPARA, SALSERIE); input PL; input RST; input ENSERIE; input CLOCK; input[3:0] ENPARA; output SALSERIE; logic SALSERIE; logic [3:0] SHIFT; always_ff @(posedge CLOCK or negedge RST) if (!RST) SHIFT <= 4'b0000 ; else if (!PL) SHIFT <= ENPARA ; else begin SHIFT[3] <= ENSERIE ; begin : xhdl_0 integer i; for(i = 2; i >= 0; i = i - 1) begin : DESPLAZAR SHIFT[i] <= SHIFT[i + 1] ; end end SALSERIE=SHIFT[0]; end endmodule
分析过程:
SHIFT是4位宽的logic信号,所有更新操作都在always_ff块里用非阻塞赋值<=完成,每一位都需要触发器来保存状态,这里贡献4个触发器。SALSERIE是1位输出,虽然用的是阻塞赋值=,但它的赋值被放在always_ff块内——意味着只有在时钟上升沿时才会更新值,相当于把SHIFT[0]的输出同步寄存了一级,所以这会生成1个额外的触发器。- 两者相加:4+1=5个触发器,和题目描述一致。
实例2:生成32个触发器的代码
module SHIFTER2D(clock,reset,clear,shift,entrada_serie, salida_serie); parameter tamanyo=4; input clock; input reset; input [7:0] entrada_serie; input clear; input shift; output [7:0] salida_serie ; logic [tamanyo-1:0][7:0] aux; always_ff @(posedge clock or negedge reset) if (!reset) aux<={tamanyo{8'b0}}; else if (!clear) if (shift==1'b1) aux<={entrada_serie,aux[tamanyo-1:1]}; else begin aux[tamanyo-1]<= entrada_serie; aux<={tamanyo{8'b0}}; end assign salida_serie=aux[0]; endmodule
分析过程:
- 核心存储信号是
aux,它的定义是[tamanyo-1:0][7:0],当参数tamanyo=4时,相当于4组8位的寄存器,总位数是4×8=32位。 aux的所有更新操作都在always_ff块里用非阻塞赋值<=完成,每一位都需要触发器来保存状态,这里直接贡献32个触发器。- 输出
salida_serie是用assign语句直接连接aux[0],属于组合逻辑输出,不会生成额外的触发器。 - 所以总触发器数量就是32个,和题目描述一致。
内容的提问来源于stack exchange,提问作者Jhon
相关产品推荐
相关产品推荐

