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"

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

将-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

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

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

根据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

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

码流文件生成

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

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

网表文件修改

ncd2xdl

xdl -ncd2xdl top.ncd

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 "

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

网表修改

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

xdl -xdl2ncd top.xdl top.ncd
bitgen -f top.ut top.ncd

这样就可以根据修改后的网表文件生成自己想要的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

你可能感兴趣的:(FPGA,FPGA,IDE,逻辑综合,布局布线,板级测试)