棋子 · 2023年10月09日

Verilog:for循环的综合实现

1.采用for循环来计算1的数量  

采用for循环语句,逐个bit位判断是否为1,为1则累加,否则保持不变,最终输出输入信号中1的数量。

module try_top #(
    parameter   DATA_WIDTH    =       8                                       ,   //
    parameter   CNT_WIDTH     =       ($clog2(DATA_WIDTH)+1)                      //
)
(

    input                                               clk                                     ,   //
    input                                               rst_n                                   ,   //
    input               [DATA_WIDTH-1:0]                data_in                                 ,   //
    output  reg         [CNT_WIDTH-1:0]                 one_cnt                                     //

);


always@(*) begin
    one_cnt  =    'b0             ;   
    for(int i=0; i<DATA_WIDTH;i=i+1) begin : one_cnt_gen
        if(data_in[i])
        one_cnt             =          one_cnt + 1'b1    ;  
else
        one_cnt             =          one_cnt         ;   
    end
end

endmodule

综合实现--实际就是一团组合逻辑


module try_top ( clk, rst_n, data_in, one_cnt );
input [7:0] data_in;
output [3:0] one_cnt;
input clk, rst_n;
wire   n12, n13, n14, n15, n16, n17, n18, n19, n20, n21, n22;

NAND3_X1N_*Cell_TYPE*   U12 ( .A(n22), .B(n14), .C(n13), .Y(n20) );
AND2_X1N_*Cell_TYPE*   U13 ( .A(n14), .B(n13), .Y(n21) );
OA1B2_X1N_*Cell_TYPE*   U14 ( .B0(n14), .B1(n13), .A0N(n21), .Y(one_cnt[0])
         );
ADDF_X1N_*Cell_TYPE*   U15 ( .A(data_in[7]), .B(data_in[6]), .CI(n12), .CO(
n17), .S(n14) );
ADDF_X1N_*Cell_TYPE*   U16 ( .A(data_in[1]), .B(data_in[0]), .CI(data_in[2]), 
.CO(n16), .S(n12) );
ADDF_X1N_*Cell_TYPE*   U17 ( .A(data_in[3]), .B(data_in[5]), .CI(data_in[4]), 
.CO(n15), .S(n13) );
ADDF_X1N_*Cell_TYPE*   U18 ( .A(n17), .B(n16), .CI(n15), .CO(n18), .S(n22) );
INVP_X1R_*Cell_TYPE*   U19 ( .A(n18), .Y(n19) );
NOR2_X1F_*Cell_TYPE*   U20 ( .A(n20), .B(n19), .Y(one_cnt[3]) );
AOI21_X1N_*Cell_TYPE*  U21 ( .A0(n20), .A1(n19), .B0(one_cnt[3]), .Y(
one_cnt[2]) );
OA21_X1N_*Cell_TYPE*   U22 ( .A0(n22), .A1(n21), .B0(n20), .Y(one_cnt[1]) );
endmodule

image.png

2.综合实现解读  

综合工具基本原理也是for循环不断计算,提取电路结构,只不过最后一级for循环的电路结果会覆盖之前的计算结果,for循环结束,电路结构也就确定了。

因此综合工具要求for循环的次数一定是固定值,而不能是个变量。

此处需要注意的是:除了协议中明确规定是属于测试类的语法格式,其他语法格式理论上都是可以综合的,关键在于综合工具是否支持。所以是否可综合完全取决于综合工具的版本迭代。

         

3.人工实现解读

刚才说过了综合工具的实现方式,接下来我们试试人工翻译for循环。

为了简化分析流程,以DATA_WIDTH为2为例进行讲解。首先进行穷举操作,列出所有的情况,因为dat_in只有2bit,所以本案例中只有4种情况,然后计算cnt_one的表达式,将cnt_one的表达式进行逻辑化简,最终得出电路图。

         
image.png

image.png

作者:IC小鸽
文章来源:IC的世界

推荐阅读

更多IC设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
11370
内容数
1224
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息