精华内容
下载资源
问答
  • Cadence Design Systems近日表示已在RTL综合领域向前迈进一步,推出Encounter RTL编译器6.2版本。 Cadence要追上RTL综合市场领先者Synopsys仍然有很长的路要走。Synopsys多年占有接近90%的市场份额。但Cadence表示...
  • RTL综合<一>

    千次阅读 2016-10-13 21:17:31
    这次介绍一些有关RTL综合的知识组合逻辑综合可综合的逻辑可由以下方式描述: 结构化的基本门网表 一系列连续赋值语句 一个电平敏感的周期性行为 门级网表综合module test( input a, b, c, d, e, output y1_out, y2...

    这次介绍一些有关RTL综合的知识


    组合逻辑综合

    可综合的逻辑可由以下方式描述:

    • 结构化的基本门网表
    • 一系列连续赋值语句
    • 一个电平敏感的周期性行为

    门级网表综合

    module    test(
        input    a, b, c, d, e,
        output   y1_out, y2_out
    );
    wire y1, y2, y3, y4, y5, y6, y7, y8;
    and (y1, a, c);
    and (y2, a, d);
    and (y3, a, e);
    or  (y4, y1, y2);
    or  (y1_out, y3, y4);
    and (y5, b, c);
    and (y6, b, d);
    and (y7, b, e);
    or  (y8, y5, y6);
    or  (y2_out, y7, y8);
    endmodule

    综合后电路:
    RTL Viewer
    由图可看到编译器还自动把y4去除,使用了三输入或门

    连续赋值语句

    module    or_nand(
        input    en, x1, x2, x3, x4,
        output   y
    );
    assign y = ~(en & (x1 | x2) & (x3 | x4));
    endmodule

    综合后的电路:
    RTL Viewer

    电平敏感周期行为

    module    comparator(
        input        [SIZE:0]   a, b,
        output   reg            a_gt_b, a_lt_b, a_eq_b 
    );
    parameter SIZE = 2'd2;
    //--------------------------------------------
    integer k;
    always@(a or b)
    begin:compare_loop
        for(k = 0; k < SIZE; k = k + 1)
        begin
            if(a[k] != b[k])
            begin
                a_gt_b <= a[k];
                a_lt_b <= ~a[k];
                a_eq_b <= 1'b0;
                disable compare_loop;
            end
        end
        a_gt_b <= 1'b0;
        a_lt_b <= 1'b0;
        a_eq_b <= 1'b1;
    end
    //--------------------------------------------
    endmodule

    综合后电路:
    RTL Viewer


    if和case语句的综合

    if和case基本可以看做一致。一般,综合工具会判定case语句中的分支是否互不相同,如果这些选项是互不相同的,那么综合工具将认为它们具有相同的优先级别,并综合成一个MUX而不是优先级结构。甚至,当分支列表不是互不相同的时候,综合工具也允许用户决定是否以无优先权形式来处理。当if语句中的分支是用互不相同的条件指定时,该if语句会综合成MUX结构,但是分支并不是互不相同的情况下,综合工具会综合成一个优先级结构。

    module    test(
        input           a, b, c, d,
        input   [1:0]   sel,
        output  reg     y
    );
    //--------------------------------------------
    always@(*)
    begin
        case(sel)
        2'b00: y <= a;
        2'b01: y <= b;
        2'b10: y <= c;
        2'b11: y <= d; 
        endcase
    end
    //--------------------------------------------
    endmodule

    RTL Viewer

    Technology Map Viewer
    case语句综合成了MUX结构,消耗了两个LE

    module    test(
        input           a, b, c, d,
        input   [1:0]   sel,
        output  reg     y
    );
    //--------------------------------------------
    always@(*)
    begin
        if(sel == 2'b00)           y <= a;
        else if(sel == 2'b01)      y <= b;
        else if(sel == 2'b10)      y <= c;
        else                       y <= d;
    end
    //--------------------------------------------
    endmodule

    RTL Viewer

    Technology Map Viewer
    由上可见,RTL视图只是按照语言流程综合的,未经过任何优化,将其代码优化后生成的Technology Map视图可看作针对器件优化后的视图,if和case优化后的视图一致,可见两者在综合后的实现一样。

    case casez casex的使用

    case

    case 0 1 x z
    0 1 0 0 0
    1 0 1 0 0
    x 0 0 1 0
    z 0 0 0 1

    casez

    casez 0 1 x z
    0 1 0 0 1
    1 0 1 0 1
    x 0 0 1 1
    z 1 1 1 1

    casex

    casex 0 1 x z
    0 1 0 1 1
    1 0 1 1 1
    x 1 1 1 1
    z 1 1 1 1

    1. 大多数情况下,一般使用casez语句,case语句用的也较少,强烈不推荐使用casex语句。不过需要说明的是,这三个case语句都是可综合的,都能生成RTL电路。
    2. 在casez语句中,如果敏感信号表达式和分支表达式某些位的值(考虑对应二进制的情况下)为高阻态(即z或Z),那么对这些位的比较就会忽略,不予考虑,而只关注其他位的比较结果。
    3. 在casex语句中,如果敏感信号表达式和分支表达式某些位的值(考虑对应二进制的情况下)为高阻态或不定态(即z或x),则在进行敏感信号表达式和分支值比较时,这些位不参与比较(也就是忽略该位),而只关注其他位的比较结果。

    full_case语句

    在case语句(含casez和casex)中,通常使用default选项来对分支选项中没有列举到的敏感信号表达式的值做统一的处理,从功能上看,如果不需要处理的分支值一般来说是我们不需要的功能,可以不写,但对于综合器来说,如果分支选项不全的话,对FPGA/CPLD硬件的资源的使用甚至是性能的使用是有影响的。

    module    test(
        input   [1:0]   sel, 
        input   [2:0]   a,
        output  reg     y
    );
    //--------------------------------------------
    always@(*)
    begin
        casez(sel)       
        2'b00: y <= a[0];
        2'b01: y <= a[1];
        2'b10: y <= a[2];
        endcase
    end
    //--------------------------------------------
    endmodule

    综合后的视图
    RTL Viewer
    然后加上default分支
    RTL Viewer

    • 从语法角度上看,这个case语句实现的是一个多路选择功能,这两个RTL图中也都体现出来了,唯独不同的是,在前一个RTL视图中,还多了一个y$latch!这是一个锁存器。也就是说,当case语句分支选项不全时,综合器会自动生成一个锁存器,一旦敏感表达式不和分支选项值都不同时,电路不会产生新的输出,而是保持上次电路的运行结果。
    • 有时候,这种锁存器的功能我们不需要,但是它的产生占用了fpga资源。如果说不想使用default语句,也不想生成锁存器的话,可以采用综合属性full_case来避免锁存器的生成。
    module    test(
        input   [1:0]   sel, 
        input   [3:0]   a,
        output  reg     y
    );
    //--------------------------------------------
    always@(*)
    begin
        casez(sel)      //synthesis full_case
        2'b00: y <= a[0];
        2'b01: y <= a[1];
        2'b10: y <= a[2];
        endcase
    end
    //--------------------------------------------
    endmodule

    综合后
    RTL Viewer

    • 和带有default语句的几乎一样。但是需要说明的是,当sel为2’b11时,y输出不是0,而是随机值。在使用这个语句过程中,不要把sel端的外接输入的值设为2’b11。
    • 所以,当分支选项不全时,case条件语句会生成锁存器。合理的使用综合属性可以避免锁存器,或者使用default分支项。同理,对于if条件语句来说,如果没有else选项的话也会生成锁存器。

    展开全文
  • verilog 数字系统设计 -RTL综合 测试平台与验证 的 随书光盘源程序
  • verilog 数字系统设计 -RTL综合 测试平台与验证(第二版)书中 源代码 从学校图书馆借的原书cd直接拷贝的 电子工业出版社
  • verilog sheji verilog数字系统设计-rtl综合、测试平台与验证
  • verilog数字系统设计-rtl综合测试平台与验证 书中的源代码 希望对大家有帮助
  • 《verilog数字系统设计-rtl综合、测试平台与验证(第二版)》(作者)[美]纳瓦毕等(译者)李广军等
  • RTL代码中,有一些直接被RTL例化的cell,在综合的时候,不希望被Design Compiler的给优化掉。可以在合成之前,将已经被map的cell设置成dont touch 属性。 set_dont_touch [get_cells * -hierarchical -filter "is_...

    在RTL代码中,有一些直接被RTL例化的cell,在综合的时候,不希望被Design Compiler的给优化掉。可以在合成之前,将已经被map的cell设置成dont touch 属性。

    set_dont_touch [get_cells * -hierarchical -filter "is_mapped==true"]

    设置之后,综合,综合之后,再将cell属性弄成false。

      set_dont_touch [get_cells * -h -filter "is_mapped==true"]
      compile
      set_dont_touch [get_cells * -h] false
    展开全文
  • 有限状态机及其设计技术是数字系统设计中的重要组成部分,是实现高效率、高可靠性逻辑控制的重要途径。大部分数字系统都可以划分为控制单元和数据单元两个组成部分。通常,控制单元的主体是一个状态机,它接收外部...
  • 国外电子与通信教材系列】verilog数字系统设计-rtl综合、测试平台与验证(第二版)(高清版).pdf )
  • 针对现有寄存器传输级(register transfer level,RTL)综合中资源共享仅针对算术逻辑单元(arithmetic logic unit,ALU)的问题,提出扩展型资源共享的方法.该方法对所有逻辑门进行共享,既可优化ALU,又可优化普通...
  • RTL综合<2>----for循环

    2016-10-14 15:37:58
    对于现在的仿真器,for循环一般都是可以综合的。`timescale 1ns / 1ps module test( input clk, rst_n, input [7:0] data, output reg [2:0] num ); //===================================== int

    对于现在的仿真器,for循环一般都是可以综合的。


    `timescale 1ns / 1ps
    module    test(
        input               clk, rst_n,
        input       [7:0]   data,
        output  reg [2:0]   num
    );
    //=====================================
    integer i;
    always@(posedge clk)
    begin
        if(!rst_n)
            num <= 3'd0;
        else for (i=0; i<8; i=i+1)
                if(data[i])
                    num <= num + 1'b1;
    end
    //====================================
    endmodule

    这个代码看似是想要在一个时钟周期计算出八位data数据的高电平位数,综合后的电路:
    RTL
    看着不错,但是真的实现了所要的功能了吗?编写testbench

    `timescale 1 ps/ 1 ps
    module test_vlg_tst();
    reg clk;
    reg [7:0] data;
    reg rst_n;                                            
    wire [2:0]  num;
    
    test i1 (
        .clk(clk),
        .data(data),
        .num(num),
        .rst_n(rst_n)
    );
    initial                                                
    begin                                                  
        rst_n = 0;
        #20 rst_n = 1;
        #500 $stop;
    end
    initial                                                
    begin                                                  
        clk = 0;
        forever #10 clk = ~clk;
    end
    initial                                                
    begin                                                  
        data = 8'hA7;
    end
    endmodule

    仿真波形如下:
    sim
    可以看出,num只是每个时钟周期加一而已,并不是计算data高电平的位数,always非阻塞赋值,只有always结束后赋值给左边的,因此出现上面情况。将其改为如下:

    `timescale 1ns / 1ps
    module    test(
        input               clk, rst_n,
        input       [7:0]   data,
        output  reg [7:0]   num
    );
    //==============================================
    integer i;
    always@(posedge clk)
    begin
        if(!rst_n)
            num = 8'd0;
        else for (i=0; i<8; i=i+1)
                if(data[i])
                    num = num + 1'b1;
    end
    //==============================================
    endmodule

    仿真波形:
    sim


    似乎for循环综合这种依赖之前结果的电路会出现问题,一般只建议综合简单的分立的简单赋值:

    for (i=0; i<8; i=i+1)
        out[i] <= a[i] & b[i];

    展开全文
  •  Verilog HDL硬件描述语言既可以用于行为级建模,又可以用于RTL级建模,还可以用于可综合RTL级建模。设计工程师可以根据自己的需要来选择不同的建模方式。在项目初期,设计工程师应该选择行为级建模来构建目标...
  • iic从机RTL代码,可综合,AISC程序,已经流过片了,并在FPGA上进行了原型验证
  • Yosys-RTL开源综合工具

    千次阅读 2020-07-29 17:49:28
    https://chips4makers.io/blog/open-source-mixed-rtl-synthesis.html 其它相关信息: OpenTitan 是 Google 开发的项目,旨在鼓励厂家为数据中心和消费级设备开发所谓的信任根(root-of-trust)技术。 ...
    展开全文
  •  Verilog HDL硬件描述语言既可以用于行为级建模,又可以用于RTL级建模,还可以用于可综合RTL级建模。设计工程师可以根据自己的需要来选择不同的建模方式。在项目初期,设计工程师应该选择行为级建模来构建目标...
  • HDL在线综合查看RTL的一个工具 ctime:2020-06-08 10:29:24 +0900|1591579764 标签(空格分隔): 技术 最近在复习verilog,刷HDLBits的题, 有时候想知道两种写法综合出来的电路是不是一样的,以前都是用ISE,综合完...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,461
精华内容 2,584
关键字:

rtl综合