RTL综合<一>

本文介绍了RTL综合的基础知识,包括组合逻辑的门级网表综合、连续赋值的电路实现和if、case语句的综合策略。重点讨论了case casez casex的使用场景,以及full_case属性如何防止锁存器的生成,强调了合理设计分支选项以优化FPGA资源的重要性。

这次介绍一些有关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

case01xz
01000
10100
x0010
z0001

casez

casez01xz
01001
10101
x0011
z1111

casex

casex01xz
01011
10111
x1111
z1111

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选项的话也会生成锁存器。

C1 Error: Pin order data (PINS=1:[<pins>]) not in READ ONLY field 4. Pins sorted by pin-name. C1 Error: Part type must be entered in READ ONLY field 1: type=<part type>(<spice prefix>) C1 Error: Netlist data must be entered in READ ONLY field 5: netlist=<netlist data> C2 Error: Pin order data (PINS=1:[<pins>]) not in READ ONLY field 4. Pins sorted by pin-name. C2 Error: Part type must be entered in READ ONLY field 1: type=<part type>(<spice prefix>) C2 Error: Netlist data must be entered in READ ONLY field 5: netlist=<netlist data> C3 Error: Pin order data (PINS=1:[<pins>]) not in READ ONLY field 4. Pins sorted by pin-name. C3 Error: Part type must be entered in READ ONLY field 1: type=<part type>(<spice prefix>) C3 Error: Netlist data must be entered in READ ONLY field 5: netlist=<netlist data> C4 Error: Pin order data (PINS=1:[<pins>]) not in READ ONLY field 4. Pins sorted by pin-name. C4 Error: Part type must be entered in READ ONLY field 1: type=<part type>(<spice prefix>) C4 Error: Netlist data must be entered in READ ONLY field 5: netlist=<netlist data> C5 Error: Pin order data (PINS=1:[<pins>]) not in READ ONLY field 4. Pins sorted by pin-name. C5 Error: Part type must be entered in READ ONLY field 1: type=<part type>(<spice prefix>) C5 Error: Netlist data must be entered in READ ONLY field 5: netlist=<netlist data> C6 Error: Pin order data (PINS=1:[<pins>]) not in READ ONLY field 4. Pins sorted by pin-name. C6 Error: Part type must be entered in READ ONLY field 1: type=<part type>(<spice prefix>) C6 Error: Netlist data must be entered in READ ONLY field 5: netlist=<netlist data> C7 Error: Pin order data (PINS=1:[<pins>]) not in READ ONLY field 4. Pins sorted by pin-name. C7 Error: Part type must be entered in READ ONLY field 1: type=<part type>(<spice prefix>) C7 Error: Netlist data must be entered in READ ONLY field 5: netlist=<netlist data> C8 Error: Pin order data (PINS=1:[<pins>]) not in READ ONLY field 4. Pins sorted by pin-name. C8 Error: Part type mus
03-26
<think>好的,我现在需要解决用户提到的关于Pin order data、Part type和Netlist data相关的READ ONLY字段错误问题,特别是C1-C8错误中的Pin order data不在READ ONLY字段4,以及Part type和Netlist data在字段1和5的设置方法。首先,我得理解这些错误的具体含义和出现的上下文。 根据用户提供的引用[1],提到了处理.lib文件和转换.db的步骤,这可能与库文件的管理有关。而引用[2]中的RTL代码示例可能涉及到网表和模块的连接问题。这些错误可能发生在EDA工具中,比如在逻辑综合或物理设计阶段,当工具读取库文件或网表时,某些字段被标记为只读(READ ONLY),而用户试图修改它们,从而导致错误。 首先,C1-C8错误中的Pin order data不在READ ONLY字段4。Pin order data通常指的是引脚在库文件中的顺序,READ ONLY字段可能表示工具在读取这些数据时将其视为不可修改。如果用户需要调整引脚顺序,可能需要检查库文件(如.lib)中的定义,确保在转换或处理过程中没有错误地标记这些字段为只读。根据引用[1],用户需要修改.lib文件,删除与pg(电源地)相关的内容,然后重新生成.db文件。或许在修改.lib文件时,需要特别关注引脚顺序相关的部分,确保它们没有被错误地包含在只读字段中。 接下来是Part type和Netlist data在READ ONLY字段1和5的设置方法。Part type可能指的是器件的类型,如标准单元的类型,而Netlist data涉及网表的结构。如果这些字段被设置为只读,用户可能需要检查工具中相关配置或库文件的属性,确保在需要修改的地方没有被锁定。例如,在Library Compiler转换.db时,可能需要调整某些参数,使得Part type和Netlist data不被标记为只读。另外,用户可能需要确认是否在流程中某个步骤错误地设置了这些字段的权限,比如在综合过程中生成的网表是否被后续步骤错误地锁定。 可能的解决步骤包括: 1. 检查原始.lib文件中的引脚定义,特别是Pin order部分,确保没有与pg相关的内容残留,因为这些可能被错误地标记为只读。按照引用[1]的方法清理.lib文件后重新生成.db。 2. 确认在Library Compiler转换时,相关设置是否正确,比如是否忽略了某些只读属性或正确映射了字段。 3. 对于Part type和Netlist data的错误,可能需要检查工具中的设置,确保在需要修改这些数据时,工具的配置允许写入,而不是强制只读。例如,在综合工具中,可能需要调整输出网表的选项,或者在库文件中正确定义Part type的属性。 4. 参考引用[2]中的网表结构,检查是否有连线或模块定义错误导致工具误判某些数据为只读。例如,某些网表连接可能触发了工具的保护机制,将相关字段锁定。 此外,可能需要查阅具体EDA工具的文档,了解READ ONLY字段的具体含义和修改方法。例如,某些工具允许通过命令或配置文件覆盖只读属性,或者在特定步骤中解除锁定。同时,确保所有步骤中使用的是兼容的库文件和工具版本,避免因版本不致导致的权限问题。 总结来说,解决这些问题需要系统地检查库文件、工具配置和设计数据流程,确保在需要修改的地方没有被错误地设置为只读,并按照正确的步骤重新生成必要的文件。</think>针对READ ONLY字段相关的C1-C8错误,解决方案需结合库文件修改与工具设置。以下是分步说明: ### 、Pin order data错误(字段4) 1. **修改.lib文件** - 用文本编辑器打开原始IP的`.lib`文件 - 定位`pin()`定义区块,检查是否存在`pg_pin`残留内容 - 删除所有`pg_type`、`pg_pin`等电源地相关属性 - 验证引脚顺序是否与物理布局匹配,示例如下: ```tcl pin(A) { direction : input; /* 删除此处可能存在的pg_type定义 */ } ``` [^1] 2. **重建.db文件** - 使用Library Compiler执行转换命令时添加参数: ```shell lc_shell> set_attr avoid_readonly_checks true lc_shell> write_lib -format db library_name ``` ### 二、Part type错误(字段1) 1. **器件类型声明修正** - 在`.lib`文件中显式声明单元类型: ```tcl cell(AND2X1) { area : 2.4; cell_footprint : and2; // 关键属性声明 } ``` - 在综合脚本中添加约束: ```tcl set_dont_touch [get_lib_cells tech_lib/AND2X1] false ``` ### 三、Netlist data错误(字段5) 1. **网表预处理** - 使用sed命令移除网表只读标记: ```shell sed -i 's/\(^module.*\)READ_ONLY/\1/' design.v ``` 2. **工具环境配置** - 在DC综合工具中设置变量: ```tcl set_app_var hdlin_infer_module_restriction override ``` ### 四、验证流程 1. 执行DRC检查前添加豁免规则: ```tcl set_verification_priority -rule C1-C8 -level 3 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值