jtag访问arm内核寄存器

想实现arm jtag接口的功能验证,搭建verilog testbench去访问arm内核的寄存器。还没实现。。待完成。(暂时完成了利用jtag接口,访问arm Device ID code register的功能验证。)
已验证完成。
以下描述,基于ARM11。

jtag的原理图

网上摘了几张图,
这里写图片描述

这里写图片描述

这里写图片描述

jtag接口访问arm Device ID code register的步骤

实现jtag的IDCODE指令,然后再实验arm内核寄存器的访问。

基本原理,
tms信号,负责jtag模式切换,即下图的状态机。
第一步,通过tms信号,跳转至Shift-IR状态;
第二步,tdi信号输入IDCODE指令码;其实就是指令寄存器,输入jtag识别的指令码。
第三步,通过tms信号,跳转至Shift-DR状态;
第四步,查看tdo信号,其实就是数据寄存器输出的数据。因为指令是IDCODE,所以这一步输出的值应该是jtag的器件ID信息,32位。

注意:根据jtag协议,得到下述信息:
jtag相关输入信号,要求在tck下降沿输入。jtag输出信号,是在tck上升沿产生。

jtag接口访问arm Device ID code register的功能验证的testbench

这里写图片描述

jtag接口访问arm Device ID code register的功能验证的波形图

这里写图片描述

jtag相关注意细节

  • arm jtag的debug,一定要在arm正常启动后才能执行。
  • arm 进入jtag debug state,需要两步,一步是DSCR[14]使能;一步是Halt指令。
  • arm jtag里,有tck和ARMCLK之间的异步时钟域(这是因为jtag和ARM内核有数据交互),所以要么满足tck/ARMCLK同步要求(即,打开JTAGSYNCBYPASS使能);要么就去掉JTAGSYNCBYPASS的使能。
  • jtag的输入信号,都是在tck下降沿打进去的;jtag的输出信号,都是在tck上升沿打出来的。
  • arm的tdi和tdo,都是先最低位。
  • shift-IR最后一拍tdi输入和离开shift-IR的动作,都是在一拍内同时完成。上图代码中,注释了一行@(negedge tck)。shift-DR同理。
  • jtag可以访问专有的debug寄存器;而且可以向arm输入指令和访问数据(这是通过ITR、DTR寄存器和INTEST/EXTEST等jtag指令,根据下述步骤实现的)。
  • jtag和边界扫描,是配合成套的;jtag访问arm内核寄存器,也是通过边界扫描的实现,才能把指令/数据scan-in;并把数据scan-out。

jtag访问arm内核寄存器的步骤

如果通过jtag接口,访问memory或者register,需要提供指令码。过程简述如下:
ARM11原始文档,介绍了类似过程;这里讲得更详细一些。

  • 进入debug state。即执行arm jtag的Halt命令。注意这一步骤和下一步骤的两个shift-IR操作,不能跳过Run-Test/Idle状态【实践验证得知,具体原因还未查询】。
    可以走这个过程,jtag状态机shift-IR->exit1-IR->update-IR->Run-Test/Idle->Select-DR-Scan->Select-IR-Scan->Capture-IR->Shift-IR
  • Scan_N选择扫描链的指令,配置值为0x1;(JTAG接口就是通过扫描方式,访问ARM内核的。)(0x1是为了访问DSCR寄存器)
  • INTEST读指令;目的是为了读后写,使DSCR寄存器的部分字段恢复初始状态。
  • EXTEST写指令;DSCR[14]配置1,使能ARM Debug模式。重要步骤。而且DSCR[13]需要在单独的下一步骤配置,不能[14][13]一起配置,否则会引起不可预知的错误。
  • EXTEST写指令;DSCR[13]配置1,即使能ARM Debug状态下对指令的执行。
  • Scan_N选择扫描链的指令,配置值为0x4(0x4是访问指令传输寄存器ITR,把下一步的指令码传输给指令预取单元里)
  • EXTEST写指令;这个指令码,就是普通的arm反汇编二进制码。补充:送往PU(预取单元PrefetchUnit),然后开始指令流水,如果指令不符合要求,内部会出现DbgInstrV(debug instruction Valid信号)不能有效。
    指令举例:
    e3a02332 mov r2, #-939524096 ; 0xc8000000
    e3a01499 mov r1, #-1728053248 ; 0x99000000
    e5821020 str r1, [r2, #32]
    e5920020 ldr r0, [r2, #32]
    ee000e15 MCR P14,0,R0,C0,C5,0

注意,与DTR相关的指令需要协处理器指令完成,后面会介绍。

  • jtag状态机必须要经过Run-Test/Idle;
  • Scan_N选择扫描链的指令,配置值为0x5(这个数据传输寄存器DTR,与ITR指令传输寄存器配合使用)
  • INTEST读指令;把34bits的数据扫描出来,[31:0]是R0寄存器的值,[32]是指令是否完成的标识(如果指令未完成,会再Scan out一组34bits的数据出来),[33]是rDTRempty即数据传输寄存器里的数据是否空。

与DTR相关的协处理器指令介绍

这里写图片描述

原型:
MCR{cond} <cp_num>, <op1>, <Rd>, <CRn>, <CRm>{, <op2>}  
意义:
协处理器与ARM寄存器之间的数据传输。
其中,debug协处理器,数据传输是在DTR(即P14.C5)寄存器里。即P14.C5与ARM.Rx之间的数据搬移。
解析:
- MCRMove to coproc from ARM reg  
- {cond};条件判断,大括号表示可选参数,如果没有这个参数,则意味着无条件执行。
- <cp_num>;CoProcessor协处理器号,p0~p14。jtag对应的一般是p14,即CP14
- <Rd>;是ARM寄存器
- <CRm>;是协处理器的寄存器号。比如debug协处理器的P14.C5,就是DTR寄存器。
- <op1>, <op2>,<CRn>;这几个是可以由debug指令确认。

举例说明:
MCR P14,0,R0,C0,C5,0
属于ARM CP14 debug指令之一,叫DTR指令。
意义:
move to ARMReg[R0] from CP14.C5;其中 CP14.C5就是debug协处理器的DTR寄存器。

最后通过封装成verilog task,就可以实现简单的jtag仿真器了。

  • 6
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. JTAG(Joint Test Action Group):一种用于调试和测试电子设备的标准接口。JTAG接口可以让开发人员在不破坏设备硬件的情况下进行非侵入式的调试和测试。 2. BLX(Branch with Link and eXchange):ARM处理器指令之一,用于跳转到指定地址并将跳转前的地址保存到寄存器中。 3. MVN(Move Not):ARM处理器指令之一,用于对指定的寄存器进行按位取反的操作。 4. LR(Link Register):ARM处理器寄存器之一,用于存储跳转前的地址。 5. CPSR(Current Program Status Register):ARM处理器寄存器之一,用于存储当前程序的状态信息,如执行模式、中断使能状态、条件码等。 6. SPSR(Saved Program Status Register):ARM处理器寄存器之一,用于存储上一个程序的状态信息。 7. BSP(Board Support Package):嵌入式系统中的一种软件层,用于提供硬件抽象层、驱动程序、Bootloader等功能,使操作系统能够运行在特定的硬件平台上。 8. SOC(System on Chip):一种集成度很高的片上系统,包含了处理器、内存、IO等多个功能模块,用于实现嵌入式系统的功能。 9. LKM(Loadable Kernel Module):一种Linux内核模块,可以动态地加载到内核中,扩展内核功能。 10. JFFS(Journaling Flash File System):一种针对闪存设计的文件系统,通过日志技术提高了文件系统的可靠性和性能。 11. YAFFS(Yet Another Flash File System):一种针对闪存设计的文件系统,具有高效的垃圾回收机制和快速的文件系统恢复能力。 12. GPIO(General Purpose Input/Output):通用输入输出口,用于连接外部设备和嵌入式系统中的处理器。 13. IIC(Inter-Integrated Circuit):一种串行通信协议,用于连接多个设备,并通过两根信号线进行数据传输。 14. U-Boot:一种常用的嵌入式系统Bootloader,用于加载操作系统和应用程序。 15. Thumb状态:ARM处理器的一种指令集,用于优化代码密度。 16. Thumb-2EE状态:ARM处理器的一种指令集,扩展了Thumb指令集,并提供了更多的指令和功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值