Vivado Advanced Trigger功能
关键字:Advanced Trigger TSM
为什么要使用高级Trigger功能?
使用Vivado进行开发的工程师都知道它的Debug工具vio和ila,在使用ila上板调试的时候,为方便抓取某种条件下的波形,经常使用条件触发,设置的时候还可以设置多个条件,可以说是比较方便了,那么为什么我们还需要TSM呢?
想象一下,当你遇到这样的场景,同时抓取多组信号,每组的信号数量很多,触发条件也不一样,同一组也需要抓不同触发条件下的信号,这就会导致调试时需要频繁切换触发条件,然后抓取波形。
这个时候,就体现出了高级trigger功能的作用了,只需要你把触发状态机写好,保存到.tsm文件当中,通过一定的设置,就可以在ila窗口中使用高级Trigger功能。
ip配置
- 勾选Trigger and storage setting中的Capture Control和Advanced Trigger选项;
- 每个Probe的Probe Trigger or Data选项,选择DATA AND TRIGGER;
功能启用
JTAG连接并加载完ltx文件之后,将Settings界面的Trigger mode选择ADVANCED_ONLY,然后就可以新建.tsm文件了(或加载已存在的.tsm文件)。
If the ILA core in the design that is running in the hardware device has advanced trigger capabilities, the advanced trigger mode features can be enabled by setting the Trigger mode control in the ILA Properties window of the ILA Dashboard to ADVANCED_ONLY or ADVANCED_OR_TRIG_IN.
TSM写法
TSM的具体写法可以参考Vivado中的Tools/Language Template中Debug部分,或者参考UG908手册。
TSM即Trigger State Machine、触发状态机,先给出一个简单的写法:
state tsm_state1:
if(module_name/signal1 == 1'bR) then
trigger;
else if(module_name/signal2 == 8'u15) then
goto tsm_state2;
else
goto tsm_state1;
endif
state tsm_state2:
if(module_name/signal3 == 1'b1) then
trigger;
else
goto tsm_state2;
endif
可以看出TSM的语法类似于Tcl与verilog的融合,包含以下几个特性:
- 触发状态机包含多达16种状态;
- 每种状态可包含1、2或3个条件分支;
在触发器状态机程序中最多可以使用4个16bitcounter来跟踪多个事件;
$counter0, $counter1,$counter2, $counter3
在触发器状态机程序中最多可以使用4个flag来指示某些分支事件发生了;
$flag0, $flag1, $flag2, $flag3
- 状态机内部可以执行goto、trigger以及各种counter和flag相关的逻辑;
除了上述5个特性,还有一些基本写法以及注意事项:
- 状态机定义使用state关键字,状态之间的切换使用goto语句,触发使用trigger语句,每个状态中最后一个分支必须是goto或trigger语句;
- 注意不要丢失状态名后的冒号和分支语句结束后的分号;
- 如果使用if,else是必须的,条件语句不能嵌套;
触发条件中的信号名要写全;
如上述代码片段中tsm_state1中所示,此ila中的信号抓的是例化名为module_name的模块中的信号,当信号signal1上升沿时间进行触发;
控制计数器的命令有两条:increment_counter和reset_counter;
4个计数器分别为:
increment_counter $counter0; increment_counter $counter1; increment_counter $counter2; increment_counter $counter3; reset_counter $counter0; reset_counter $counter1; reset_counter $counter2; reset_counter $counter3;
计数器的判断只有等于(==)和不等于(!=);
if($counter2 == 16’u100) then if($counter3 != 16’u100) then
- 在进行数值比较的时候,只有三种数据格式可以选择:b,h和u,即二进制,十六进制,和无符号数;
控制flag的命令有两条:set_falg和clear_falg;
set_falg $falg0; set_falg $falg1; set_falg $falg2; set_falg $falg3; clear_falg $falg0; clear_falg $falg1; clear_falg $falg2; clear_falg $falg3;
掌握上述基本语法和注意事项后就可以编写触发状态机了。
使用TSM抓取波形
与使用ILA的基本触发功能一样,用条件触发来抓波形。
参考文档
此功能的学习参考了网上的资料以及Xilinx的UG908文档,附上链接
Vivado ILA Advanced Trigger的使用
Vivado Logic Analyzer Advanced
具体见UG908中chapter11 Debugging Logic Design in Hardware章节中的Setting Up the ILA Core to Take a Measurement小节中的Using Advanced Trigger Mode部分;