调试逻辑及变量声明顺序

Posted on 2024-03-31 15:27  绿叶落秋风  阅读(2)  评论(0编辑  收藏  举报

模型功能

  • 使用ILA观察信号
  • 观察变量的转化
  • 触发信号的设立
  • ILA调试状态机的编写
  • VIO的手动控制

模型框图

ila_0 u_ila_0(
  .clk(clk),
  .probe0(probe_0)
);

实现步骤

  1. ILA调试核的使用
  • 直接调用该IP核,可以实现一个在线逻辑分析仪的功能
  • ILA核的设置包括信号个数(对应位宽在第二页)、比较器个数、TRG输入输出、高级功能
  • 其中比较器个数和高级功能为调试状态机提供条件
    • 设置2比较时,只能进行两次同变量的比较,
  1. 观察变量的转化
  • 通过wire可以将变量转化为方便观察的量,然后连接到多个probe
  • 也可利用ila自定义端口进行转化
    • 但是这种转化出来的变量只能用于等于判断,不能用于大小判断
    • 所以最好使用probe对每个变量独立观测
  • 变量的除法除了输入触发信号,还可以利用观测信号进行自触发
    • 这个操作和示波器是一致的
  1. 触发信号的设置
  • 使用专用触发信号
    • 在这里选择触发类型
    • 将输入的信号作为专用触发信号
  • 如果要使用自触发,修改为默认的BASIC即可
  • 至于高级模式,就是状态机触发
  1. 状态机触发的实现
  • 官方的状态机触发例子,主要结构就是状态机不带case的写法,且每个if后面增加then,类似PYTHON的语法
  • 基于上述修改一个
##################################################
#
# For info on creating trigger state machines:
#   1) In the main Vivado menu bar, select
#      Window > Language Templates
#   2) In the Templates window, select
#      Debug > Trigger State Machine
#   3) Refer to the entry 'Info' for an overview
#      of the trigger state machine language.
#
# More information can be found in this document:
#
#   Vivado Design Suite User Guide: Programming
#   and Debugging (UG908)
#
##################################################
state S0:
if ( r_cnt == 32'h0000_0010 ) then
goto S1;
else 
goto S0;
endif
state S1: 
goto S2;
state S2: 
goto S3;
state S3:
trigger;


  • 编写完成后可以点击编译按钮,观察是否存在语法错误
    • 从这个文件调试中发现以下的要点:
      (1)位宽必须严格对应(和GUI设置自触发一样)
      (2)不支持d十进制匹配,而是使用u代替,这里和verilog不一致
      (3)trigger语句代表状态机结束,不能在进行其他逻辑
      (4)一个变量只能出现一种形式的比较,也就是不能进行同信号的多种判断,这个可能是触发信号简化的结果
    • 上述的文件等效于 r_cnt == 32'h0000_0010,但是触发延时了三个周期
      • 当信号很多的时候,利用这个状态机可以实现触发条件的复杂联动,实现某些特殊的判断
      • 状态负责进行新的判断扫描,直达获取到对应的条件,然后再按照跳转条件进行触发
      • 如果真的需要实现硬件状态机,则需要将每个条件都通过独立的通道进行导入
        • 这样才能实现真正的非即时断言的功能
  1. VIO的手动控制
  • 除了检测信号,xilinx提供了VIO进行虚拟信号的生成
  • 主要是搭建一个简易的信号控制,可以用于无指令系统时的简易控制
  • 这个使用比较简单,就不再展开

最终效果

  • 延时3个周期后触发

调用接口