https://mp.weixin.qq.com/s/0u9jM2u-FkTlrk3QNuZaBw

简单介绍JtagTap的实现。

1. 简单介绍

定义TAP(Test Access Port)所需要的相关模块,并实现一个生成TAP的方法。

2. JTAGIO

定义JTAG模块的输入输出接口,输入输出方向是从master side的视角出发决定:

其中,TDO是一个三态值:

3. JtagOutput

定义JTAG模块的输出信号:

a. state:JTAG的当前状态;

b. instruction:当前执行的指令;

c. reset:在Test-Logic-Reset状态输出的复位信号;

4. JtagControl

输入Jtag模块的控制信号,这里是复位信号:

5. JtagBlockIO

聚合在一起的Jtag模块的输入输出接口:

其中:

a. jtag:从slave侧看的TCK/TMS/TDI/TDO等接口;

b. control:Jtag模块控制信号,这里是复位信号;

c. output:Jtag模块的输出信号;

d. idcode:根据类参数决定是否包含JTAGIdcodeBundle数据,用以支持IDCODE指令:

e. irLength:指令寄存器的宽度;

6. JtagControllerIO

定义Jtag控制器的输入输出接口:

a. dataChainOut:数据串出接口;

b. dataChainIn:数据串入接口;

7. JtagTapController

定义Jtag TAP控制器:

1) 类参数

a. irLength:指令寄存器宽度;

b. initialInstruction:初始指令;

2) io

Jtag控制器输入输出接口:

3) stateMachine

stateMachine是JtagTapController的状态机:

a. 创建状态机;

b. suggestName:为stateMachine命名;

c. 灌入tms信号:stateMachine.io.tms := io.jtag.TMS;

d. 输出状态机的状态到currState和io.output.state;

4) stateMachine.io.currState/currState/io.output.state

a. stateMachine.io.currState是状态机中使用的状态,也是最原始(最先变化)的状态;

b. currState:JtagTapController中使用的状态,使用Wire挂在stateMachine.io.currState上作为下游,所以其值与stateMachine.io.currState一致;

c. io.output.state:JtagTapController将stateMachine.io.currState输出到io.output.state,以把状态机的状态作为JtagTapController的状态输出;

5) dataChain

A. 串入串出

data chain使用的是JtagControllerIO,只能串入串出;不像irChain是CaptureUpdateChain,可以并入并出(parallel-in/parallel-out)。

B. 交叉

a. io.jtag.TDI输出到io.dataChainOut.data:

b. io.dataChainIn.data输出到TDO:

c. 为什么不是TDI到io.dataChainIn.data,而io.dataChainOut.data到TDO?

如果与指令寄存器(IR)相比较,指令寄存器只有一个,只是其中存放的指令不同,并不会有多个指令同时存在。

而数据寄存器(DR)则包括很多,TAP控制器需要根据指令的不同,把不同的数据寄存器连接到TDI和TDO之间。

6) irChain

a. CaptureUpdateChain

irChain是一个CaptureUpdateChain,可以并入并出。并且irChain的io.chainIn与io.chainOut中间以移位寄存器链相连接。

b. io.jtag.TDI输出到irChain.io.chainIn.data;

c. irChain.io.chainOut.data输出到TDO:

7) tdo

tdo输出到io.jtag.TDO,tdo_driven用于控制TDO是否active:

8) activeInstruction

A. activeInstruction来自于nextActiveInstruction和updateInstruction;

B. 取值

a. reset为真

当模块处于复位状态时,使用initialInstruction;

b. 如果当前状态为UpdateIR,则从irChain.io.update.bits获取更新后的指令;

c. 其他情况下,则不更新指令;

C. 输出activeInstruction到io.output.instruction:

9) io.output.reset

当状态为TestLogicReset时,输出复位信号:

8. JtagTapGenerator

JtagTapGenerator用于使用JtagTapController生成一个JtagTap。

1) internalIo

internalIo是一个JtagBlockIO:

相比较之下,JtagTapController模块的io接口也继承自JtagBlockIO,并且添加了dataChainIn/dataChainOut。

2) allInstructions

A. instructions

instructions是一个Map,key是指令,value是data register chain:

B. idcode

如果idcode定义了,那么也要生成一个IDCODE指令和data register chain的映射:

a. instructions中不能已经包含一个IDCODE指令

b. 生成一个idcodeChain,作为IDCODE指令使用的data chain:

c. capture

从internalIo.idcode中捕获数据:

d. 把IDCODE指令及idcodeChain的映射加入到instructions中

C. allInstructions

allInstructions中需要加入IDCODE指令,如果instructions中没有,那就把创建一个加入进去。

3) 生成initialInstruction

如果没有提供idcode,则使用BYPASS指令:

4) 创建JtagTapController

5) 处理bypassChain

a. 创建bypassChain

b. 从controller中接收输出:

c. 输出到controller:

d. 连接图

若controller选择从bypassChain输入,则bypassChain中的数据经io.dataChainIn.data输入,而后从TDO输出;

若controller选择输入到bypassChain,则TDI中的数据经过io.dataChainOut.data保存到bypassChain中;

6) 生成数据寄存器到使用其的指令的映射:chainToInstCodes

__chainToInstCodes是重构之后的代码:

a. sortedMap:把allInstructions排序之后的映射;

b. groupsByChain:按照使用的chain(test data register)分组;

c. chainToInstCodesMap:生成chain到使用这个chain的指令之间的映射;

d. 使用第一个指令进行排序;

总体而言,就是把原本指令到数据移位寄存器链的映射,转换为数据移位寄存器链到指令序列的映射。

7) 根据controller中正在执行的指令,确定使用的是哪一个data chain:

8) 生成逻辑,把选择到的chain,输出到controller中:

若没有选择到任何一个data chain,则使用bypassChain。

9) 生成逻辑,让选择到的chain,从controller接收数据:

没有选择到的data chain,从unusedChainOut中获取数据:

因为shift/capture/update都是false,所以没有选择到的data chain内容不会发生变化。

10) data chain连接图

11) 连接与controller的jtag/control/output接口:

12) 返回internalIo供外部使用

实际上可以把这个Generator定义为JtagTap类,而internalIo就是JtagTap模块的io。

Rocket - jtag - JtagTap的更多相关文章

  1. Rocket - jtag - JtagStateMachine

    https://mp.weixin.qq.com/s/cFXVOBHayV2w27jpT5RglA 简单介绍JtagStateMachine的实现. 1. 简单介绍 根据IEEE 1149.1-200 ...

  2. Rocket - jtag - JtagShifter

    https://mp.weixin.qq.com/s/pHtrlmSCPqzlDdfj3qkNPQ 简单介绍JtagShifter的实现. 1. 简单介绍 实现移位寄存器链,包含并行Capture和U ...

  3. Rocket - debug - DebugTransport

    https://mp.weixin.qq.com/s/EcsuTjb4hFF9Ncig9Gfhew 简单介绍DebugTransport的实现. 1. JtagDTMConfig 1) JtagDTM ...

  4. STM32C8T6 JTAG使用到PB3|PB4|PA13|PA14|PB15端口做普通IO时,需禁止JTAG!

    GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIO ...

  5. STM32用JLINK 烧写程序时出现NO Cortex-m device found in JTAG chain现象和解决方案

    现象 CPU: STM32107VC 用JLINK 烧写程序时出现NO Cortex-m device found in JTAG chain 如图无法查找到硬件就是CPU 提示1:NO Cortex ...

  6. 偶遇STM32 JTAG和SWD口(调试)被禁用无法下载,已经粗暴解决!

    处女座,为了板子走线美观,拉线方便,在项目量产前,还更改了原来外设的IO口,埋头苦干一天,移植ok,发现PB3一直不听使唤,好,加班检查代码,检查初始化,时钟,IO对应,然后试PCB板,是否短路,断路 ...

  7. (转)小心FPGA的JTAG口(上电和下电顺序)

    同志们,根据ALTERA官方FAE(现场应用工程师)的强烈建议,请注意不要随意带电插拔你的JTAG下载接口,否则会损坏FPGA芯片的JTAG口信号管脚.现象:在排除了下载线的问题后,还是不能访问FPG ...

  8. JTAG 学习 -SVF格式

    yxr注: 主要zt,附上自己的心得如下: 1)反观SVF文件,除了设置必要的条件之外(初始条件和TIR等四条命令),真正的运行命令就两条,SIR向JTAG TAP状态机的IR寄存器送命令,SDR往J ...

  9. [异常解决] JTAG 与STM32的SWD连接接线方式

    如果我们的板子上只留了4个接口:V3.3,SWDIO,SWDCLK,GND.那么和JTAG的连接关系参见下图: dd400cf22b5c01e57a6c9e198d5383a0_189.jpg (0 ...

随机推荐

  1. linux的用户管理、组管理

    用户管理:centos系统是一个多用户系统 用户分为三类: 超级用户(root) 用户id为 0 伪用户 用户id为1-499,虽然存在,但是不能用户登录 普通用户 用户id为500-60000 用户 ...

  2. 【Swift】获取UILabel中点击的某个功能标签文字并作出响应动作

    1.需求 首先.针对UILabel中显示的多个功能标签,作出颜色标记提示. 其次.对关键字作出点击响应动作. 如图所示: 解决: 1.使用正则匹配到关键字 public static var hash ...

  3. Java BC包做sm2加密方法 ,签名验签方法

    package com.sdyy.common.bc_sm2; import org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateF ...

  4. pyhanlp安装成功,import导入失败,出现:importerror: cannot import name 'jvmnotfoundexception'

    1.问题描述: pyhanlp成功安装,并且可以正常使用,但是这段时间再去用的时候,发现出问题了,一运行就出现,下面的问题: importerror: cannot import name 'jvmn ...

  5. STM32 Bootloader基于ymodem传输协议串口IAP升级详解

    硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 文章目录 1 预备知识 2 Bootloader 2.1 启动流程 2.2 校验跳转地址是否有效 ...

  6. Autojs - 用 JavaScript 实现自己的安卓手机自动化工具脚本

    我是风筝,公众号「古时的风筝」,一个不只有技术的技术公众号,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者. Spring Cloud 系列文章已经完 ...

  7. 单片机之静态局部变量static

    HL-1慧静电子 上程序: main.c #include <reg52.h>#include "Timer.h" /********P1口低有效*********** ...

  8. 栈溢出(Stack Overflow)

    调用栈(Call Stack)描述的时函数之间的调用关系.它由多个栈帧(Stack Frame)组成,每个栈帧对应着一个未运行完的函数.栈帧中保存了该函数的返回地址和局部变量,因而不能再执行完毕后找到 ...

  9. [hdu5247]rmq+预处理

    题意:有一个无序数组,求有多少个长度为k的区间满足把区间内的数排序后是连续的. 思路:长度为k的区间排序后是 连续的数等价于maxval-minval等于k-1并且不同的数有k个(或者说没有相同的数) ...

  10. java ->会话技术Cookie&Session

    会话技术Cookie&Session 会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户 ...