在CSDN这个BLOG中我详细给出了如何在VIVADO中插入在线逻辑分析仪进行信号获取。这里再记录一下自己用的一个小技巧: 实例化一个统一的多款口大位宽的ILA,在多处使用。
我们在一个模块内插入ILA要测试的端口数和位宽都不一样,根据每个需求做生成一个ILA显然工作量有点大,也生成了那么多ILA只用一次调试完就丢弃的化,项目文件也就比较乱了。我们可以先实例化一个多个端口,比方说16个端口,在模块中最大的寄存器是64BIT,我们就实例化一个16个端口,每个端口都是64位的ILA,如下图
实际使用时候我们可以做一层包装:
module ila_64x16 (
input clk,
input [63:0] in0,in1,in2,in3,in4,in5,in6,in7,in8,in9,in10,in11,in12,in13,in14,in15
);
XIL_ILA_64x16 XIL_ILA_64x16_i(
.clk_0(clk),
.probe0_0(in0),
.probe1_0(in1),
.probe2_0(in2),
.probe3_0(in3),
.probe4_0(in4),
.probe5_0(in5),
.probe6_0(in6),
.probe7_0(in7),
.probe8_0(in8),
.probe9_0(in9),
.probe10_0(in10),
.probe11_0(in11),
.probe12_0(in12),
.probe13_0(in13),
.probe14_0(in14),
.probe15_0(in15)
);
endmodule
这样目的是为了以后自己可以根据不同平台来修改这些ILA代码,当然也可以直接修改这个模块来DISABLE这些ILA的实现。
我在使用的时候只要是用到不大于16个端口每个端口位数不大于64的,都可以实例化这个ILA来实现。如下:
module sdrpi_gpsdo_ether_socket_eeprom (
input clk_125m, rst,// clk_40m,
input clk_125m_eth,rst_eth,
// iic eeprom
input scl_i,
output scl_o,scl_t,
input sda_i,
output sda_o,sda_t,
// gpsdo interface
output dac_nsyc,dac_clk,dac_din,
output gps_pl_led,
input pps_in ,
input gpsdo_model ,
//phy interface
output [7:0] phy_tx_dout ,
output phy_tx_err,
output phy_tx_en,
input phy_tx_clk,
output phy_gtx_clk,phy_reset_n,
input [7:0] phy_rx_din,
input phy_rx_dv ,phy_rx_clk,
// sokect interface
input [7:0] socket0_pl2net_d,
input socket0_pl2net_wr,
output socket0_pl2net_full,
output [7:0] socket0_net2pl_d,
output socket0_net2pl_wr,
input [7:0] socket1_pl2net_d,
input socket1_pl2net_wr,
output socket1_pl2net_full,
output [7:0] socket1_net2pl_d,
output socket1_net2pl_wr,
// eeprom interface
output eeprom_idle ,
input wr_req,
input [7:0] wr_addr,
input [63:0] wr_u64,
output wr_done ,
// eeprom interface
input rd_req,
input [7:0] rd_addr,
output [63:0] rd_u64,
output rd_done ,
output do_halt
);
ila_64x16 ila_64x16 (
.clk( clk_125m_eth ),
.in0( my_rcv_port_a ),
.in1( socket0_net2pl_wr ),
.in2( socket0_net2pl_d ),
.in3( a_rcv_src_ip ),
.in4( my_rcv_port_b ),
.in5( socket1_net2pl_wr ),
.in6( socket1_net2pl_d ),
.in7( b_rcv_src_ip ),
.in8( 123 ) ,
.in9( ) ,
.in10( ) ,
.in11( ) ,
.in12( ) ,
.in13( ),
.in14( )
);
这里我们看到1位的和8位的数据都直接接在了ILA的接口,这是VERILOG语法语义所允许的,高位直接补0;另外一些没有用到接口直接空置了,或者都没有写出来(比如in15就没有写出),(或者如in8端口在空置的端口写上每次编译不同的数字ID,好在ILA中确保调试的是对应的编译结果)。
下图是ILA分析仪结果,
这里不便就是在16进制显示时候多了若干0以补齐64位,可以设置成signed 或者unsigned的显示方式就好了。另外设置采集触发时候要可以设置成UNSIGNED 的表示,对1位的触发条件就根据需要写0或者1就行.
这样有了这一个通用的模块,就可以多出来例化调用了,非常方便。
在进行设计的时候要把自己考虑在内,自己的感受自己的工作量,因为毕竟自己不是一个机器人。有了这样一模块就可以不必写多个ILA模块,让自己更多精力放在要解决的问题上,少做无用功进度就快了,用更多时间来琢磨优化和规范设计,总结思路。