怎么知道RTL Schematic中的instance与哪段代码对应呢
2013-06-23 20:15:47
ISE综合后可以看到RTL Schematic,但我们知道在RTL编码时,要经常问自己一个问题“我写的这段代码会综合成什么样的电路呢”。对于一个简单的设计,比如一个触发器,综合后的RTL电路可能只有一个instance,就是触发器,很直观。但对于一个比较大的设计,RTL Schematic就比较复杂,包含了很多instance,怎么知道RTL Schematic中的instance与哪段代码对应呢,也就是如何找到感兴趣的instance在RTL代码中的definition?
这个问题一直困扰了我很久,最近发现在ISE的RTL Schematic以及planahead的RTL Schematic都可以解决这个问题。
下面以一个异步FIFO为例,说明如何找到RTL Schematic中的instance对应的代码。
在ISE下:
代码:
1 module asynchronous_fifo1( 2 wrst_n, 3 wclk, 4 winc, 5 wdata, 6 wfull, 7 8 rrst_n, 9 rclk, 10 rinc, 11 rdata, 12 rempty 13 ); 14 15 parameter DATASIZE = 8; //FIFO中数据宽度 16 parameter ADDRSIZE = 4; //FIFO地址宽度 17 18 input wrst_n; 19 input wclk; 20 input winc; 21 input [DATASIZE-1 : 0] wdata; 22 output wfull; 23 24 input rrst_n; 25 input rclk; 26 input rinc; 27 output [DATASIZE-1 : 0] rdata; 28 output rempty; 29 30 31 wire [ADDRSIZE-1 : 0] waddr; 32 wire [ADDRSIZE : 0] wptr; 33 wire [ADDRSIZE : 0] rq2_wptr; 34 35 wire [ADDRSIZE-1 : 0] raddr; 36 wire [ADDRSIZE : 0] rptr; 37 wire [ADDRSIZE : 0] wq2_rptr; 38 39 wire wea; 40 41 //向RAM中写数据或从中读数据 42 assign wea = winc & (!wfull); 43 44 fifo_mem fifo_mem_u ( 45 .clka(wclk), // input clka 46 .wea(wea), // input [0 : 0] wea 47 .addra(waddr), // input [3 : 0] addra 48 .dina(wdata), // input [7 : 0] dina 49 .clkb(rclk), // input clkb 50 .addrb(raddr), // input [3 : 0] addrb 51 .doutb(rdata) // output [7 : 0] doutb 52 ); 53 54 //产生写地址waddr、写指针wptr、满信号full 55 wptr_full #(ADDRSIZE) wptr_full_u ( 56 .wrst_n(wrst_n), 57 .wclk(wclk), 58 .winc(winc), 59 .wq2_rptr(wq2_rptr), 60 .wfull(wfull), 61 .waddr(waddr), 62 .wptr(wptr) 63 ); 64 65 //产生读地址raddr、读指针rptr、空信号empty 66 rptr_empty #(ADDRSIZE) rptr_empty_u ( 67 .rrst_n(rrst_n), 68 .rclk(rclk), 69 .rinc(rinc), 70 .rq2_wptr(rq2_wptr), 71 .rempty(rempty), 72 .raddr(raddr), 73 .rptr(rptr) 74 ); 75 76 //两个时钟域时间的接口,将读时钟域下的rptr同步到写时钟域,得到wq2_rptr 77 sync_r2w #(ADDRSIZE) sync_r2w_u ( 78 .wrst_n(wrst_n), 79 .wclk(wclk), 80 .rptr(rptr), 81 .wq2_rptr(wq2_rptr) 82 ); 83 84 //两个时钟域时间的接口,将写时钟域下的wptr同步到读时钟域,得到rq2_wptr 85 sync_w2r #(ADDRSIZE) sync_w2r_u ( 86 .rrst_n(rrst_n), 87 .rclk(rclk), 88 .wptr(wptr), 89 .rq2_wptr(rq2_wptr) 90 ); 91 92 endmodule
关于FIFO的全部代码,上传到了pudn:http://www.pudn.com/downloads546/sourcecode/embedded/detail2254196.html
综合得到的RTL Schematic顶层模块如下:
假设我们要找rptr_empty_u对应的代码,先选中该模块,右键单击在弹出的菜单中选择open sorce of selected inatance即可跳转到定义该instance对应的RTL代码处。并用黄色的三角指针指出来,如下:
但有的较为底层的in,tance,只能跳转到包含该instance的module的开始或结尾。假设我们要找图中与门对应的代码,就只能跳转到包含该instance的module的开始,没有黄色指针,只是有光标,如下:
这可能是ISE的一个bug吧,但好在通过planahead可以解决。
下面是planahead下的操作。
在planahead下的综合后,打开RTL Schematic,如下所示:
同样地,要找rptr_empty_u对应的代码,先选中该模块,右键单击在弹出的菜单中选择 Go to Instantiation即可跳转到定义该instance对应的RTL代码处。并将光标指向所在的位置,如下:
要找出与门对应的代码,用同样的方法,就可以找到对应的RTL代码,如下:
非门同样也可跳转到正确的位置,这在ISE中是做不到的。
注意:
- 对于ISE Navigator,只有在RTL schematic中才能追踪某个instance的代码来源,在technology schematic中是不能追踪的;
- 相应的,在planahead中,没有 RTL Schematic 与Technology Schematic的概念,而是在不同的设计步骤有不同的schematic。在RTL Design后,看到的schematic对应ISE中的RTL Schematic,RTL Design是综合之前的步骤;在该步骤中的schematic可以追踪某个instance的代码来源。在Netlist Design后,看到的schematic对应ISE中的Technology Schematic,Netlist Design是综合之后的步骤。在该步骤中的schematic不可以追踪某个instance的代码来源。
- 另外在planahead中还可以通过右键的菜单找到某个instance的defination,这在ISE中也是没有的;
- 关于RTL schematic与technology schematic的区别,详见:http://www.cnblogs.com/youngforever/p/3155045.html