QuietE

如何知道一段代码中使用多少个寄存器

0
阅读(3186)

群里 咩咩 问了一个问题 一段代码用了多少个寄存器怎么判断

在编写verilog代码时,随手定义一个寄存器变量,从来没想过这会占用多少寄存器资源。

所以我的第一想法 就是去看 报告 fitter下有个资源使用情况的报告。

下面是一段三八译码器的verilog代码

module decoder(

//global clock

input clk,

input rst_n,

output reg [3:0]cnt,

input en,

input [2:0] data_in ,

output reg [7:0] data_out

);

always @(en or data_in )

begin

if(!en)

data_out = 8'b0;

else

case(data_in)

3'd0: data_out = 8'b0000_0001;

3'd1: data_out = 8'b0000_0010;

3'd2: data_out = 8'b0000_0100;

3'd3: data_out = 8'b0000_1000;

3'd4: data_out = 8'b0001_0000;

3'd5: data_out = 8'b0010_0000;

3'd6: data_out = 8'b0100_0000;

3'd7: data_out = 8'b1000_0000;

default: data_out = 8'b0;

endcase

end

//----------------------------

//Counter for 4 bit data

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

cnt <= 0;

else

cnt <= cnt + 1'b1;

end

endmodule clip_image002

这是映射之后的,在这里可以看 design implementation registers 用了四个寄存器资源。

但是 这里要的是一段代码的。。。

也有人说在rtl视图里看clip_image004

clip_image006

有人回复:

clip_image007

看在时钟的跳变沿有多少信号更新 这个应该就是最终答案了

按照这个方式,数了一下,果然,在时钟的跳变沿,只有cnt发生了变化,而cnt定义为四位宽的reg,所以,报告中设计所用寄存器为4个。

寄存器用于存储数据,一般由D触发器构成,在时钟脉冲来临更新数据。所以,即使定义了reg型变量,假如不通过时钟跳变沿更新,编译器还是不会将它综合为寄存器。