使用在线路线逻辑分析仪ILA调试模块的小技巧

本文介绍了如何在Vivado中通过实例化一个统一的多端口ILA模块,以适应不同位宽和数量的信号调试需求,避免频繁创建和废弃ILA,保持项目文件整洁。通过在顶层模块中包装ILA实例,可以灵活地根据实际需求接入不同数量和宽度的信号,简化ILA的使用和管理。这种方法提高了调试效率,减少了无用工作,有助于更专注于设计优化。

优快云这个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模块,让自己更多精力放在要解决的问题上,少做无用功进度就快了,用更多时间来琢磨优化和规范设计,总结思路。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值