• ISE网表逆向分析与使用技巧


    当自己的编译器将设计文件编译成一块板砖时,必须掌握这些ISE使用技巧以便于做逆向分析。将自己的编译结果转化到ISE的软件中来验证与定位还是挺复杂的过程,涉及一系列网表的逆向与转换问题,首先得根据布局与map的结果将文件转化为.V文件与.UCF文件,根据自己的布线文件约束ISE的布线行为。相对于直接将码流文件转化为.v文件与.UCF文件,有布线中间文件就不要在配置文件中搜寻网表的连接关系,目前只探索到了如下:

    ISE约束文件

    ISE的约束文件可以通过两种方式构建:1.自己创建ucf约束文件;2.使用ISE自带工具PlanAhead;

    手写UCF约束文件的一些使用案例

    NET “clk0” TNM_NET = “sys_clk_grp”; #在时钟网线clk上附加一个TNM_NET约束,把clk0驱动的所有同步元件定义为一个名为sys_clk的分组

    使用TIMESPEC约束sys_clk_grp的周期

    TIMESPEC "TS_ sys_clk_grp " = PERIOD " sys_clk_grp " 9.9 ns HIGH 50 %;#周期9.9ns,HIGH指出时钟周期里的第一个脉冲是高电平,如果是LOW表示是低电平,占空比50%

    FROM_TO用来定义两个逻辑组之间的时序约束

    语法:TIMESPEC “TS_name " = FROM “group1” TO " group2” value;
    TIMESPEC “TS_p2s” = FROM “pads” TO “ffs” 10; # pads到ffs延迟10ns

    最大偏移约束MAXSKEW用于说明同一点驱动的时钟信号经过路径传播后,到达两个或多个终点的时间差

    NET “AC97_Bit_Clk” MAXSKEW =10ns;

    IO管脚与电平协议约束

    NET tft_wr LOC=C11 | IOSTANDARD = LVCMOS33;
    NET clk0 IOSTANDARD = LVCMOS33;#IO电平标准 有LVCMOS25、LVTTL、SSTL2_I、LVDCI_33等
    NET sys_rst_in LOC = D6;
    NET sys_rst_in PULLUP;# PULLUP、 PULLDOWN上拉和下拉设置
    NET sys_rst_in TIG;# TIG(Timing Ignore)不进行时序约束
    NET SYNC DRIVE = 8 | SLEW = SLOW;# DRIVE :最小驱动电流,单位mA,可以有2,4,6,8,12,16这几种模式,SLEW ={FAST|SLOW|QUIETIO}, QUIETIO仅用在Spartan-3A。SLEW是压摆 ,如果slew=fast 会出现过冲,此时DRIVE如果很大(12mA)会导致输出功率的失真很厉害,有可能会不满足外接的器件的要求。

    通配符

    NET gpio_char_lcd<6> LOC = AE13;
    NET gpio_char_lcd<5> LOC = AC17;
    NET gpio_char_lcd<4> LOC = AB17;
    NET gpio_char_lcd<3> LOC = AF12;
    NET gpio_char_lcd<2> LOC = AE12;
    NET gpio_char_lcd<1> LOC = AC10;
    NET gpio_char_lcd<0> LOC = AB10;
    NET gpio_char_lcd<> IOSTANDARD = LVCMOS33;
    NET gpio_char_lcd<
    > TIG;
    NET gpio_char_lcd<> PULLDOWN; # 表示任意字符串
    INST "/CLK_logic/
    " LOC = CLB_r
    c7; #把CLK_logic层次中所有的实例放在第7列的CLB中

    区域约束

    Locate DCM/BUFG - Tools can probably figure them out automatically
    but just LOC them down to be safe
    INST dcm_0/dcm_0/DCM_ADV_INST LOC = DCM_ADV_X0Y1;
    INST dcm_1/dcm_1/DCM_ADV_INST LOC = DCM_ADV_X0Y2;
    INST dcm_2/dcm_2/DCM_ADV_INST LOC = DCM_ADV_X0Y0;
    INST dcm_0/dcm_0/CLK0_BUFG_INST LOC = BUFGCTRL_X0Y0;
    INST dcm_0/dcm_0/CLK90_BUFG_INST LOC = BUFGCTRL_X0Y1;
    INST dcm_0/dcm_0/CLKDV_BUFG_INST LOC = BUFGCTRL_X0Y2;
    INST dcm_1/dcm_1/CLK0_BUFG_INST LOC = BUFGCTRL_X0Y31;
    INST dcm_1/dcm_1/CLK90_BUFG_INST LOC = BUFGCTRL_X0Y30;
    例如:
    INST “Done” LOC = “SLICE_X32Y163” ; #Done映射为一个寄存器,映射到SLICE_X32Y163的位置上。(32,163)相当于一个坐标,可以用FloorPlanner进行查看。INST"BRAM4/BU2/U0/blk_mem_generator/valid.cstr/ramloop[0].ram.r/v4_init.ram/TRUE_DP.SINGLE_PRIM.TDP"LOC = “RAMB16_X2Y22” ;#RAM16的一个映射。
    又例如,X,Y,Z是对应的是寄存器。现在想把它们放在一个指定的区域中,我可以这样写,
    INST “X” AREA_GROUP = reg;
    INST “X” AREA_GROUP = reg;
    INST “X” AREA_GROUP = reg;
    AREA_GROUP reg RANGE = SLICE_X1Y1 :SLICE_X1Y6;
    INST “lut_inst” BEL = A6LUT;#bel的约束

    使用planahead工具做约束

    使用floorplan做约束,首先会对设计进行综合操作,经过综合后才知道设计文件实现过程中需要使用哪些类型的资源,然后对netlist中的cells进行约束,关闭软件导出约束至ucf文件。
    目前没有看到对布线路径约束的相关资料,可能ISE目前还不支持对布线路径进行约束。

    使用命令行操作ISE编译

    综合

    xst -intstye ise -ifn "D:/pyj/test_v7_330/xc35t/top.xst" -ofn "D:/pyj/test_v7_330/xc35t/top.syr"
    
    • 1

    top.xst文件就是综合时使用的脚本文件,可以通过修改top.xst文件对综合选项进行修改,top.syr为综合的log日志文件或称为报表文件
    例如:

    set -tmpdir "xst/projnav.tmp"
    set -xsthdpdir "xst"
    run
    -ifn top.prj
    -ofn top
    -ofmt NGC
    -p xc7a100t-1-csg324
    -top top
    -opt_mode Speed
    -opt_level 1
    -power NO
    -iuc NO
    -keep_hierarchy No
    -netlist_hierarchy As_Optimized
    -rtlview Yes
    -glob_opt AllClockNets
    -read_cores YES
    -write_timing_constraints NO
    -cross_clock_analysis NO
    -hierarchy_separator /
    -bus_delimiter <>
    -case Maintain
    -slice_utilization_ratio 100
    -bram_utilization_ratio 100
    -dsp_utilization_ratio 100
    -lc Auto
    -reduce_control_sets Auto
    -fsm_extract YES -fsm_encoding Auto
    -safe_implementation No
    -fsm_style LUT
    -ram_extract Yes
    -ram_style Auto
    -rom_extract Yes
    -shreg_extract YES
    -rom_style Auto
    -auto_bram_packing NO
    -resource_sharing YES
    -async_to_sync NO
    -shreg_min_size 2
    -use_dsp48 Auto
    -iobuf YES
    -max_fanout 100000
    -bufg 32
    -register_duplication YES
    -register_balancing No
    -optimize_primitives NO
    -use_clock_enable Auto
    -use_sync_set Auto
    -use_sync_reset Auto
    -iob Auto
    -equivalent_register_removal YES
    -slice_utilization_ratio_maxmargin 5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    将-bufg 32改为-bufg 0,则在实现过程中不使用bufg。
    综合后的网表文件为xx.ngc文件,可以通过ngc2edif工具将ngc文件转化为综合后的物理门级网表edif文件,该文件中电路网表的连接关系并不代表编译后的网表,在编译过程中lut的例化情况可能被进一步优化,当lut被优化时该真值表也会发生变化,因此综合后的lut真值表不能代表最终配置文件中的真值表。

    映射

    文件转换

    ngdbuild -intstyle ise -dd _ngo -nt timestamp -uc top.ucf -p xc5vsx35t-ff665-1 top.ngc top.ngd
    
    • 1

    top.ucf文件为约束文件,xc5vsx35t-ff665-1表示器件类型,top.ngc文件表示综合后加密的网表文件;将网表文件与约束文件转化为map时需要使用的***.ngd文件,同时生成的**.bld文件为日志文件或报表文件;

    映射

    map -intstyle ise -p xc5vsx35t-ff665-1 -w -logic_opt off -ol high -t 1 -register_duplication off -global_opt off -mt off -cm area -ir off -pr off -lc off -power off -o top_map.ncd top.ngd top.pcf
    
    • 1

    xc5vsx35t-ff665-1表示器件类型,-w应该表示warning的意思吧,-logic_opt off应该表示关闭逻辑优化;top_map.ncd文件表示映射后生成的物理网表信息,top.ngd为逻辑综合与约束合并的文件,top.pcf文件为映射后的物理约束文件;

    布局布线

    par -w -intstyle ise -ol high -mt off top_map.ncd top.ncd top.pcf
    
    • 1

    根据top.pcf约束文件对top_map.ncd映射后网表文件进行布局布线操作,top.ncd文件为布局布线后的电路网表文件。布局布线的日志文件保存在**.par文件中。

    trce -intstyle ise -v 3 -s 1 -n 3 -fastpaths -xml top.twx top.ncd -o top.twr top.pcf -ucf top.ucf
    
    • 1

    TRCE会分析你的FPGA的设计并且产生一个后缀名为“.twr”的时序报告。你可以用任何文本工具打开它,也可以用xilinx的Timing Analyzer。Timing Analyzer比较直观,推荐新手使用。

    码流文件生成

    bitgen -intstyle ise -f top.ut top.ncd
    
    • 1

    top.ut文件类似一个脚本文件,保存了在码流文件在生成过程中需要遵守的规则,top.ncd文件表示编译后最终的电路网表文件;

    网表文件修改

    ncd2xdl

    xdl -ncd2xdl top.ncd
    
    • 1

    top.ncd文件表示待转化的网表文件,将top.ncd文件转化为top.xdl文件,该文件具备较好的阅读性;
    对比设计文件、映射后网表以及布局布线后的网表文件

    设计文件:
     LUT6 #
    	 (.INIT(64'h33CC33CC00000000))
    	 lut_inst(
    	 .O(b),
    	 .I1(a),
    	 .I3(c),
    	 .I5(1'b1)
    	 );
    映射后网表:
    inst "b_OBUF" "SLICEM",placed CLBLM_X1Y22 SLICE_X0Y22  ,
      cfg " A5LUT::#OFF A5RAMMODE::#OFF A6LUT:lut_inst:#LUT:O6=(A5@A6)
           _BEL_PROP::A6LUT:BEL:A6LUT A6RAMMODE::#OFF ACY0::#OFF ADI1MUX::#OFF
           AFF::#OFF AFFINIT::#OFF AFFMUX::#OFF AFFSR::#OFF AOUTMUX::#OFF AUSED::0
           B5LUT::#OFF B5RAMMODE::#OFF B6LUT::#OFF B6RAMMODE::#OFF BCY0::#OFF
           BDI1MUX::#OFF BFF::#OFF BFFINIT::#OFF BFFMUX::#OFF BFFSR::#OFF BOUTMUX::#OFF
           BUSED::#OFF C5LUT::#OFF C5RAMMODE::#OFF C6LUT::#OFF C6RAMMODE::#OFF
           CCY0::#OFF CDI1MUX::#OFF CEUSED::#OFF CFF::#OFF CFFINIT::#OFF CFFMUX::#OFF
           CFFSR::#OFF CLKINV::#OFF COUTMUX::#OFF COUTUSED::#OFF CUSED::#OFF
           D5LUT::#OFF D5RAMMODE::#OFF D6LUT::#OFF D6RAMMODE::#OFF DCY0::#OFF
           DFF::#OFF DFFINIT::#OFF DFFMUX::#OFF DFFSR::#OFF DOUTMUX::#OFF DUSED::#OFF
           PRECYINIT::#OFF REVUSED::#OFF SRUSED::#OFF SYNC_ATTR::#OFF WA7USED::#OFF
           WA8USED::#OFF WEMUX::#OFF "
    布局布线后网表:
    inst "b_OBUF" "SLICEM",placed CLBLM_X1Y22 SLICE_X0Y22  ,
      cfg " A5LUT::#OFF A5RAMMODE::#OFF A6LUT:lut_inst:#LUT:O6=(A1@A4)
           _BEL_PROP::A6LUT:BEL:A6LUT A6RAMMODE::#OFF ACY0::#OFF ADI1MUX::#OFF
           AFF::#OFF AFFINIT::#OFF AFFMUX::#OFF AFFSR::#OFF AOUTMUX::#OFF AUSED::0
           B5LUT::#OFF B5RAMMODE::#OFF B6LUT::#OFF B6RAMMODE::#OFF BCY0::#OFF
           BDI1MUX::#OFF BFF::#OFF BFFINIT::#OFF BFFMUX::#OFF BFFSR::#OFF BOUTMUX::#OFF
           BUSED::#OFF C5LUT::#OFF C5RAMMODE::#OFF C6LUT::#OFF C6RAMMODE::#OFF
           CCY0::#OFF CDI1MUX::#OFF CEUSED::#OFF CFF::#OFF CFFINIT::#OFF CFFMUX::#OFF
           CFFSR::#OFF CLKINV::#OFF COUTMUX::#OFF COUTUSED::#OFF CUSED::#OFF
           D5LUT::#OFF D5RAMMODE::#OFF D6LUT::#OFF D6RAMMODE::#OFF DCY0::#OFF
           DFF::#OFF DFFINIT::#OFF DFFMUX::#OFF DFFSR::#OFF DOUTMUX::#OFF DUSED::#OFF
           PRECYINIT::#OFF REVUSED::#OFF SRUSED::#OFF SYNC_ATTR::#OFF WA7USED::#OFF
           WA8USED::#OFF WEMUX::#OFF  _ROUTETHROUGH:A:AMUX "
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    从三个文件对比可以看出,映射后的网表、设计网表以及布局布线后网表并不是完全一致的,该LUT6的功能虽然保持着与设计文件中的一致,但其真值表一直在变化。

    网表修改

    可以根据自己的需求对xdl网表文件进行修改,不过这个操作需要修改人员对底层文件非常熟悉,例如将以上xdl文件中的lut6的表达式所对应的管脚进行修改时,需要同时修改下面net中的布线路径;
    修改完成后可以通过以下指令生成码流文件:

    xdl -xdl2ncd top.xdl top.ncd
    bitgen -f top.ut top.ncd
    
    • 1
    • 2

    这样就可以根据修改后的网表文件生成自己想要的bit文件。

    动机

    由于花了半个月的时间做了xilinx v5系列的通用编译器模型,需要对整套工具链进行测试,但是对设计文件编译后发现上板实验发现功能与预期的功能不一致,定位问题最直接的方法就是将工具链的编译结果迁移到ISE中进行验证;
    1.根据编译结果,提取原语模块,io,根据编译结果生成.v文件与.ucf文件,ucf文件约束至bel级别就可以完成cells的同步;
    2.根据自己的布线路径修改xdl文件,使xdl文件中的布线路径与自己编译器的布线路径一致,将网表转化为码流文件;
    3.上板验证,功能一致;
    问题不久找到了,布线路径或者原语例化所对应的码位映射关系有问题,不过确实如此

    致谢

    感谢高中同学与硕士同学的帮助,才能让我半天就解决该问题,成功使用自己的编译器将设计文件跑在FPGA板上!

    参考文献

    https://www.eefocus.com/leageshine/blog/08-02/143385_09a79.html
    https://www.cnblogs.com/chengqi521/p/6747294.html

  • 相关阅读:
    WPF入门教程系列二十四——DataGrid使用示例(1)
    OPT-001
    从零开发短视频电商 UUID的5个版本和缩短长度
    Android Jetpack Compose之确定重组范围并优化重组
    二:OpenCV图片叠加逻辑运算
    计算机毕业设计(附源码)python智慧社区信息平台
    关于在网上拉取项目,yarn后使用不了的,解决办法
    JAVA毕设项目商店管理系统(java+VUE+Mybatis+Maven+Mysql)
    uniapp怎么支持rtsp流监控播放
    Redis快速上手神册,17W字详解其实Redis也就那么一回事!
  • 原文地址:https://blog.csdn.net/thecentry/article/details/131138798