JTAG时序说明文件 -SVF格式(详细版)
经过拼凑和推敲,终于研究出了苗头。特此写帖记录。
语法说明
基础说明:https://blog.csdn.net/ruixj/article/details/4096498
SVF语法参考网址:https://www.cnblogs.com/arvin-blog/p/15958314.html
这里主要解释以下4条:
HDR HIR (Header Data Register, Header Instruction Register)
TDR TIR (Trailer Data Register, Trailer Instruction Register)
参考的解释网站对其的说明如下:
图1
图2
实际中,此命令在SVF文件中的位置:
图3
Q1:为什么TIR是指定一个默认的尾部模式,但是TIR代表在SIR前面添加数据。
A1:这个主要是由于串行数据输出导致的。参考图2,顺着TDI->TDO的线,先出现的器件叫尾部器件,一串上最后器件,离TDO最近的是头部器件。因为JTAG数据输出的时候,1bit 1bit的被推出,距离TDO近的先出去,先占输出数据的最低位。
Q2:这些命令的适用场景
A2:专门为图2的场景设计,即一条jtag链路,有多个可下载的器件。图3是电路环境只有一个核心芯片,所以红框内相关值都是0。假如是图2的结构,JTAG上有三个器件,只想给中间的u3下载程序,这种情况HDR HIR TDR TIR就是指明位置的。SVF文件是系统自动生成。
好处就是不怎么影响下载文件的下载命令。详细参考案例说明就有体会了。
假如没有这些命令,u3要下载的程序不变,只是设备链上去掉或增减一个,u3生出来下载文件内容大部分会发生变化(因为在一条TDI-TDO链上,就算不写其他设备,也得有数据占位)。但从u3角度,它待烧录内容是没变化的。设计的这些命令,可以维持u3下载数据一致性。SVF文件中就把这些命令写在正式下载数据前。烧录过程中,SVF文件会被解析,那些变量作为全局影响因子被记录,对u3的数据从相对描述变为绝对描述下载进去。
案例说明
以特别致谢的帖1为例,整理修改内容如下:
首先讨论JTAG上有1个器件, svf部分预览
。
//javascript
TIR 0 ; //设备链描述
HIR 0 ;
HDR 0 ;
TDR 0 ;
SIR 6 TDI (09) ; //读取下载器件的ID
SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f3631093) MASK (0fffffff) ;
SIR 6 TDI (3f) ; //bypass模式
SDR 1 TDI (00) SMASK (01) ;
第7行 SIR 6 TDI (09)
这一条命令是向IR寄存器中输入6bit数据,数值是0x09;这是读取IDCODE的指令,6是IR Length,0x09是命令。输入读取IDCODE的指令后,就是读取IDCODE。
SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f3631093) MASK (0fffffff) ;
这一条命令是向DR寄存器发送32位数据,由于JTAG是串行的,所以这里输入的数据没有意义,只是为了串行移出DR寄存器中的32bit数据。
SMASK中的全f代表输入的数据全部有效,不过这里由于输入没有意义,所以这个SMASK也没有意义。
TDO后面是预计输出的值,这里是0xf3631093,意思是预计输出为这个数据。后面的MASK代表对TDO数据的有效性。Artix-7的ID是 0x3631093,也就是说只有7个16进制数据。IDCODE寄存器是32位,多出4位数据是无关紧要的,所以这里的mask值为 0fffffff,表明低28位有效,高4位无效。如果ID核对不上,会停止下载。
另外说明一下,如果没有重新声明,TDI的SMARK和TDO的MASK会一直被使用到下次修改。同样,TIR等命令也是如此。
这段意思是,假如前面有用过:
SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f3631093) MASK (0fffffff) ;
那么下次这句再出现,可以以这样的形态:
SDR 32 TDI (00000000) TDO (f3631093) ;
虽然没写SMASK 、MASK ,但是依旧是SMASK (ffffffff)和MASK (0fffffff) 。
随后的两条命令,代表是bypass模式。
SIR 6 TDI (3f) ;
SDR 1 TDI (00) SMASK (01) ;
SVF文件,除了设置必要的条件之外(初始条件和TIR等四条命令),真正的运行命令就两条,SIR向JTAG TAP状态机的IR寄存器送命令,SDR往JTAG TAP状态机的DR寄存器送数据,在写入的时候,送入的数据有效,在读取的时候,送数据同时输出的数据有效。
下面讨论JTAG上有3个器件,简单讨论都是Artix-7。那么IR Length都是6. 要操作的是中间一个。
//javascript
TIR 0 ; //设备链描述
HIR 0 ;
HDR 0 ;
TDR 0 ;
SIR 18 TDI (3f27f) ; //读取下载器件的ID。
SDR 34 TDI (000000000) SMASK (3ffffffff) TDO (6c62126) MASK (1ffffffe)
SIR 18 TDI (3ffff); //bypass模式
SDR 3 TDI (00) SMASK (02) ;
对SIR的影响:
按照上诉设备链情况,第一个器件和第三个器件的IR寄存器数据都是bypass命令 111111;中间一个器件的命令是001001。
总共的数据是 111111_001001_111111,
改写一下,11_1111_0010_0111_1111,为0x3f27f
对SDR的影响:
同理,bypass的数据寄存器位宽是1位,取这一位为0,所以数据总长度是34,预计输出是 0x6c62126,掩码为 1ffffffe
//上文中的具体变化如下
ID:0xf3631093(仅1个器件时读数)
等价于下
32'b 1111_0011_0110_0011_0001_0000_1001_0011
新的设备链SDR,前后都会多出1bit的0
34'b 0+1111_0011_0110_0011_0001_0000_1001_0011+0
等价于下
新ID: 01_1110_0110_1100_0110_0010_0001_0010_0110。即为0x6C62126
(中间的器件ID28bit。但占据低位的1bit的0忽略不掉,而高位的就可以忽略了)
新MASK 00_0001_1111_1111_1111_1111_1111_1111_1110。即为1ffffffe
由此可见这样的写法及计算麻烦,可读性也差。为了方便使用,SVF引入了TIR、HIR、TDR和HDR四条指令。
引入后如下。
//javascript
TIR 6 TDI (3f) SMASK (3f) ; //设备链描述
HIR 6 TDI (3f) SMASK (3f) ;
TDR 1 TDI (00) SMASK (01) ;
HDR 1 TDI (00) SMASK (01) ;
SIR 6 TDI (09) ; //读取下载器件的ID。下文此处作为第1行算起
SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f3631093) MASK (0fffffff) ;
SIR 6 TDI (3f) ; //bypass模式
SDR 1 TDI (00) SMASK (01) ;
TIR是在SIR前面添加数据,比如,操作器件是第二个,那么第一个器件的数据用TIR添加,下一条指令是添加第一个器件的bypass命令。
TIR 6 TDI (3f) SMASK (3f) ;
同理,TDR是在SDR前面添加数据。
TDR 1 TDI (00) SMASK (01) ;
HIR是在SIR后面添加数据,所以第三个器件的bypass命令如下。
HIR 6 TDI (3f) SMASK (3f) ;
HDR 1 TDI (00) SMASK (01) ;
添加这四条命令之后,对第二个器件的操作命令就和只有一个器件时完全一样了,直接使用下面的命令即可
SIR 6 TDI (09) ;
SDR 32 TDI (00000000) TDO (f3631093) ;
再次修改之前,TIR等四条命令一直有效。(一直有效是指在第二个器件下载文件中,只要后面没出现TIR新的修改值,一直用这个)
特别致谢帖
首先感谢此博主的学习笔记,数据清晰,解释明了:
帖1:链接:https://www.cnblogs.com/e-shannon/p/5919933.html
为防止帖1挂了,这是它的CSDN转载版https://blog.csdn.net/u012294613/article/details/122217976
也感谢这个帖子,里面的TDO数据好像有问题,但是HIR等描述可供参考,案例情形也给的很多。
帖2:链接:https://blog.csdn.net/cckkppll/article/details/138632127
(后期有时间自己搭建下类似结构,贴下一手数据吧。留坑~)