【多链下SVF 之HDR HIR TDR TIR详解 】

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)
参考的解释网站对其的说明如下:
HDR、HIR示意图
图1
FPGA多链结构示意图
图2
实际中,此命令在SVF文件中的位置:
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
(后期有时间自己搭建下类似结构,贴下一手数据吧。留坑~)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值