引导语句“// synopsys translate_off”

本文详细介绍了Synopsys Design Compiler (DC) 中的引导语句,包括如何使用//synopsys translate_off和//synopsys translate_on来控制综合过程,避免特定代码被综合。同时,文章还讲解了parallel_case和full_case的使用,以优化case语句的综合结果,避免不必要的锁存单元生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自

http://home.eeworld.com.cn/home.php?mod=space&uid=180876&do=blog&id=41641

 

以前一直没弄懂,以为就是个简单的注释完事,原来还可以用来引导综合过程:

设计者在写设计代码时,有时可能针对仿真写一些语句,这些语句可能是不为DC所接受,也不希望DC接受;设计者如果不对这些语句进行特殊说明,DC读入设计代码时就会产生语法错误。

另一种情况是,设计者在写设计代码,有些设计代码是为专有的对象写的(如公司内部),这些专有的设计代码可能不希望被综合。

Synopsys提供了引导语句,设计者可以使用这些引导语句控制DC综合的对象。
在设计代码中,引导语句“// synopsys translate_off”后直到“// synopsys translate_on”之间的语句被DC忽略。下面的例子给出了这两个引导语句的用法。

举例:
// synopsys translate_off
`ifdef ZTEIC
// synopsys_translate_on
    `define VENDOR_ID 16'h0083
// synopsys_translate_off
`else
    `define VENDOR_ID 16'h0036
`endif
// synopsys_translate_on


parallel_case 和full_case引导格式
一般情况下,DC把case语句综合成选择器电路,但也可能把case语句综合成优先权译码电路。有时,优先权译码电路是不必要的,这是可以使用“// synopsys parallel_case”引导语句强迫DC把case语句综合成选择器电路。这种引导格式在case状态声明没有完全列举时应用较多。

举例:
always @(cs_state)
begin
    case(cs_state) // synopsys parallel_case
          2'b00: next_state = 2'b01;
          2'b01: next_state = 2'b00;
          2'b10: next_state = 2'b10;
          default: next_state = 2'b00;
    endcase
end

在case语句中,如果列举的条件不完全,DC将生成不必要的锁存单元。在状态机描述中,可能没有一些状态,此时如果不加声明,DC将认为条件没有完全列举。在这种情况下,设计者可以使用full_case引导语句。


举例:
always @(cs_state)
begin
    case(cs_state) // synopsys full_case
        2'b00: next_state = 2'b01;
        2'b01: next_state = 2'b00;
        2'b10: next_state = 2'b10;
    endcase
end

`timescale 1ns / 1ns module dft_alu( dft_type_ex, funct3_ex, rs1_data_ex, rs2_data_ex, rs3_data_ex, rd_data_ex ); input dft_type_ex; input [ 2:0] funct3_ex; input [31:0] rs1_data_ex; input [31:0] rs2_data_ex; input [31:0] rs3_data_ex; output [31:0] rd_data_ex; parameter MAC = 3'b000; parameter MACH = 3'b001; parameter MACB = 3'b010; parameter MSH = 3'b100; parameter ADDH = 3'b101; parameter SUBH = 3'b110; wire mac_en; wire mach_en; wire macb_en; wire msh_en; wire addh_en; wire subh_en; wire [31:0] mult32_op1; wire [31:0] mult32_op2; wire [15:0] mult16_op1; wire [15:0] mult16_op2; wire [ 7:0] mult8_1_op1; wire [ 7:0] mult8_1_op2; wire [ 7:0] mult8_2_op1; wire [ 7:0] mult8_2_op2; wire [15:0] addh_op1; wire [15:0] addh_op2; wire [15:0] addh_op3; wire [15:0] addh_op4; wire [15:0] subh_op1; wire [15:0] subh_op2; wire [15:0] subh_op3; wire [15:0] subh_op4; wire [31:0] mult32_result; wire [31:0] mult16_result; wire [15:0] mult8_1_result; wire [15:0] mult8_2_result; wire [31:0] addh_result; wire [31:0] subh_result; assign mac_en = dft_type_ex & ( funct3_ex == MAC ); assign mach_en = dft_type_ex & ( funct3_ex == MACH ); assign macb_en = dft_type_ex & ( funct3_ex == MACB ); assign msh_en = dft_type_ex & ( funct3_ex == MSH ); assign addh_en = dft_type_ex & ( funct3_ex == ADDH ); assign subh_en = dft_type_ex & ( funct3_ex == SUBH ); assign mult32_op1 = mac_en ? rs1_data_ex : ( mach_en | msh_en ) ? { {16{rs1_data_ex[15]}}, rs1_data_ex[15:0] } : macb_en ? { {24{rs1_data_ex[7]}}, rs1_data_ex[7:0] } : 32'b0; assign mult32_op2 = mac_en ? rs2_data_ex : ( mach_en | msh_en ) ? { {16{rs2_data_ex[15]}}, rs2_data_ex[15:0] } : macb_en ? { {24{rs2_data_ex[7]}}, rs2_dat
03-20
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值