在编写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
这是映射之后的,在这里可以看 design implementation registers 用了四个寄存器资源。
但是 这里要的是一段代码的。。。
也有人说在rtl视图里看
有人回复:
看在时钟的跳变沿有多少信号更新 这个应该就是最终答案了
按照这个方式,数了一下,果然,在时钟的跳变沿,只有cnt发生了变化,而cnt定义为四位宽的reg,所以,报告中设计所用寄存器为4个。
寄存器用于存储数据,一般由D触发器构成,在时钟脉冲来临更新数据。所以,即使定义了reg型变量,假如不通过时钟跳变沿更新,编译器还是不会将它综合为寄存器。