0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Verilog:for循环的综合实现

冬至子 来源:IC的世界 作者:IC小鸽 2023-10-09 16:31 次阅读

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1328

    浏览量

    109510
  • for循环
    +关注

    关注

    0

    文章

    61

    浏览量

    2445
收藏 人收藏

    评论

    相关推荐

    verilog HDL 可综合模型的结构

    。 建立可综合模型的原则 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点: (1)不使用初始化语句。 (2)不使用带有延时的描述。 (3)不使用循环次数不确定的
    发表于 10-20 08:10

    Verilog综合子集

    Verilog综合子集
    发表于 04-01 12:44

    verilog语言中怎么实现从0计数到255再计回到0,以此循环呢?

    verilog语言中怎么实现从0计数到255再计回到0,以此循环呢?求大神提示啊 拜托拜托!!!
    发表于 01-04 17:37

    verilog 循环以及@(clock)的综合

    1,在一个verilog程序里,如果循环是一个循环次数不可定的循环,那么它能被综合工具综合吗2,
    发表于 02-03 15:29

    讨论Verilog语言的综合问题

    在本篇里,我们讨论 Verilog 语言的综合问题,Verilog HDL (Hardware Description Language) 中文名为硬件描述语言,而不是硬件设计语言。这个名称提醒我们
    发表于 07-29 07:42

    Verilog HDL综合实用教程

    Verilog HDL 综合实用教程第1章 基础知识第2章 从Verilog结构到逻辑门第3章 建模示例第4章 模型的优化第5章 验证附录A 可综合的语言结构附录B 通用库
    发表于 07-20 11:21 86次下载
    <b class='flag-5'>Verilog</b> HDL<b class='flag-5'>综合</b>实用教程

    综合Verilog语法和语义

    综合Verilog语法和语义(剑桥大学,影印):第七版
    发表于 05-21 14:50 27次下载
    可<b class='flag-5'>综合</b>的<b class='flag-5'>Verilog</b>语法和语义

    Verilog HDL数字设计与综合课件(第二版)

    介绍Verilog HDL数字设计与综合的课件
    发表于 12-23 10:58 0次下载

    如何设计可综合Verilog代码和应该遵循什么原则

    在接触Verilog 语法参考手册的时候,我们发现其提供了一组非常丰富的功能来描述硬件。所以大家往往会疑惑那些Verilog语句是可综合的,那些是只能用于写Testbench的,其实,参考手册中只有
    发表于 04-20 10:59 4195次阅读

    Verilog综合循环语句

    Verilog中提供了四种循环语句,可用于控制语句的执行次数,分别为:for,while,repeat,forever。其中,for,while,repeat是可综合的,但循环的次数需
    发表于 10-13 12:23 1.9w次阅读

    如何使用Verilog HDL描述可综合电路?

    1、如何使用Verilog HDL描述可综合电路 Verilog 有什么奇技淫巧?我想最重要的是理解其硬件特性。Verilog HDL语言仅是对已知硬件电路的文本描述。所以编写前: 对
    的头像 发表于 04-04 11:19 3952次阅读
    如何使用<b class='flag-5'>Verilog</b> HDL描述可<b class='flag-5'>综合</b>电路?

    Verilog逻辑设计中的循环语句和运算符

    “ 本文主要分享了在Verilog设计过程中一些经验与知识点,主要包括循环语句(forever、repeat、while和for)、运算符。”
    的头像 发表于 03-15 11:41 4494次阅读

    Verilog循环语句简介

    在这篇文章中,我们讨论了可以在verilog中使用的不同类型的循环 - for循环,while循环,forever循环和repeat
    的头像 发表于 04-15 09:19 2169次阅读

    Verilog常用的循环语句及用途

    本文主要介绍verilog常用的循环语句,循环语句的用途,主要是可以多次执行相同的代码或逻辑。
    的头像 发表于 05-12 18:26 1468次阅读

    verilog中for循环是串行执行还是并行执行

    中的for循环也是并行执行的。 Verilog中的for循环可以用来实现重复的操作,例如在一个时钟周期中对多个电路进行操作。在循环内部,多个
    的头像 发表于 02-22 16:06 1269次阅读