开放科学(资源服务)标志码(OSID):
在高端服务器或低功耗嵌入式产品中,调试机制虽然不受关注但不可或缺。已经通过验证测试的成熟芯片产品一般提供非入侵式、入侵式这两种或其中一种调试机制[1]。入侵式调试机制主要通过软件或硬件中断陷入调试模式[2],主要以断点和单步调试为代表。用户在断点和步进调试过程中,可以控制应用程序代码运行到代码中的指定点,然后Halt标识的处理器,此时,用户可以选择检查或更改内存以及寄存器内容,步进或重新启动应用程序。非侵入式调试机制以跟踪(Trace)模式为主,主要实现方式是将CPU状态及指令流信息压缩导入存储器,协同软件解压缩开展现场或性能分析,能够帮助用户查证CPU在全速运转下才出现的或偶然发生而不可预测的错误[3]。
本文针对某自主国产SoC芯片(下文简称为GCXP),设计一个保证用户可调试观测和安全性的用户调试解决方案。调试行为通过中断及其处理程序来实现,保证在调试中断监控下开展调试行为。兼容开源上位机OpenOCD调试软件生态,从而支持Eclipse等IDE。不同于ARM、Sivife等需要进行CPU设计,本文方案向CPU IP核已经设计完备的SoC中增加硬件辅助调试功能,不需要修改CPU设计。
1 相关工作目前,大多数处理器都独立设计了一套调试体系结构,以便于用户进行片上调试。例如,x86体系结构提供了6个调试寄存器来支持硬件断点和调试异常[1],同时Intel Processor Trace[2]也是一个备受关注的硬件辅助调试特性[3-4]。Arm架构的处理器具有调试和非调试两种状态,并设计了一组调试寄存器来支持自主机调试和外部调试[5-6]。同时,ARM[7-9]还引入了硬件组件,如Embedded Trace Macrocell[10]和Embedded Cross Trigger[11],以完成各种硬件辅助调试目的。相应地,硬件供应商通过片上调试端口将上述调试特性暴露给外部调试器,比较常用的调试端口是IEEE 1149.1[12]定义的联合测试工作组(Joint Test Action Group,JTAG)端口,主要用来支持调试目标和外部调试工具之间的通信。使用JTAG端口和外部调试工具(如Intel System Debugger[13]、ARM DS-5 [14]、OpenOCD[15]),开发人员能够有效、方便地访问目标的内存和寄存器。
ARM的调试基础架构称为CoreSight,主要实现调试和跟踪这2个功能:
1)调试功能,运行处理器的控制,允许启动和停止程序单步调试源码和汇编代码,在处理器运行时设置断点,即时读取/写入存储器内容和外设寄存器,读写内部和外部FLASH存储器。
2)跟踪功能,提供程序计数器采样、数据跟踪、事件跟踪等,实现CPU历史序列调试、软件性能分析和代码覆盖率分析。
开源SoC硬件辅助调试解决方案主要有RISCV Debug Spec 0.11/0.13[16]、Open SoC Debug(OSD)[17],两者都描述了基于Run-Stop、Trigger、System Bus Access调试的具体规范细节,后者着重描述Trace模式并给出了基于Rocket-Core的参考设计实现,需要在Core内实现Core Debug Unit逻辑,前者有独立的Trace-Spec[18],依赖CPU预留Core Trace IO。
在GCXP系列中,用户通过片外维护控制模块访问I/O和存储空间,CPU片内状态通过扫描链硬件逻辑来观测调试[19-20]。同时,特有的HMCODE机制也可以在核心驱动调试以承担调试功能,但一般不对用户开放。与商业SoC调试功能相比,现阶段GCXP系列产品的调试机制缺少安全性[21]以及交互、断点、灵活读写功能,同时缺乏上位机调试软件IDE工具生态[22],尤其在安全性和嵌入式用户调试工具生态上,存在较大缺陷,如基于扫描链重用的调试机制,因扫描链在芯片上留下一个独立的逻辑接口,不受任何权限检查,可以在任何时刻获取芯片内部的状态信息,相当于为芯片增加了一个“后门”。同时,文献[21]中也提到了一种JTAG扫描链攻击的逆向技术,黑客可以获取扫描链上芯片架构设计相关细节信息。在嵌入式用户调试工具方面,ARM、Sifive都配备对应的上位机IDE或兼容主流开源IDE,如Eclipse、Keil等,与硬件调试辅助机制相结合,可以提供便捷丰富的寄存器以及内存观测读写、断点、程序下载、性能分析功能。
GCXP硬件辅助调试配套软件部署要求较高(可参见文献[20]),且只提供观测功能,目前没有与商业SoC产品类似的用户环境。此外,交互式调试设计需要CPU设计配合,是流水线设计的重要一环,且目前没有向已有成熟CPU设计的SoC环境中增加交互调试的方法。
2 GCXP-1A调试模块设计GCXP-1A是一款面向低功耗嵌入式领域、采用精简GCXP指令集的国产通用处理器核心,实现了全独立自主指令集嵌入式子集,是GCXP架构下面向嵌入式领域的处理器核心,该核心采用IP化设计,指令、数据存储器工作模式、TLB条目数等关键微结构参数化设计,并实现标准AXI接口,便于通用SoC集成。
GCXP-1A设计主要参考RISCV Debug Spec 0.13.2规范及Sifive U500K开源SoC源码,兼容RISCV OpenOCD软件调试工具及OpenOCD的IDE生态,结合GCXP软硬件架构开展调试模块设计,结合GCXP特权架构开展用户调试工具的硬件设计,同时在OpenOCD软件端开辟GCXP分支,兼容RISCV Debug Spec 0.13.2流程,实现完整的Run-Stop侵入式调试机制以及OpenOCD接口下的基本调式、程序下载功能,相较于无感知的扫描链重用调试信息获取,该方法处于调试中断语义监控环境中,安全性更高,并且对CPU核内无设计要求,借助OpenOCD,可直接与GDB、开源IDE产品对接,可以向前扩展CPU产品的通用调试生态,同时开展模拟验证及FPGA验证,从而证明功能的正确性。
RISCV Debug Spec 0.13.2 Spec中对CPU设计提出了诸多要求,例如,需要2条调试专用指令EBREAK、DRET,Trigger硬件断点寄存器,以及调试模式与配套的DPC、DCSR寄存器等,同时,在流水线控制上也需要对应的设计。在GCXP特权架构下,为了不对原有CPU设计、操作系统核软件接口及编译工具链设计进行改动,取消调试模式(调试模式在RISCV开源CPU中实现,特权层级还是处于M模式,严格上来说并不算是一种独立的特权层级),同时,EBREAK与DRET分别设计成GCXP指令集中的SYSCALL,并分别约定特定的调用号,将DPC、DCSR放入Debug Module(IO地址空间)中。同时,因为GCXP HM特权架构不响应中断,所以将RISCV Trigger调试中断、单步调试、硬件调试中断都进行重新设计,并设置对应的HMCODE处理软件程序,以实现Spec中调试中断处理的硬件逻辑部分。
2.1 硬件逻辑设计由于GCXP-1A面向低功耗MCU场景,因此调试机制设计主要考虑用户调试应用程序的Run-Stop调试以及外设I/O、Memory内容读写功能这些需求,从而实现中断调试模式、总线访问调试。GCXP-1A的具体硬件逻辑架构如图 1所示。
![]() |
Download:
|
图 1 GCXP-1A用户调试模块的逻辑架构 Fig. 1 Logical architecture of GCXP-1A user debugging module |
RISCV Debug Spec 0.13.2中主要规范了一套抽象调试命令,便于不同架构具体实现与调试工具及生态解耦,其Run-Stop调试机制基于DM模块接管PC来实现,分为Trigger中断(由硬件断点触发)、上位机调试中断、软件断点陷入调试中断这3类,最终通过Debug ROM程序与调试模块(Debug Module,DM)状态机协同路由,决定CPU PC取指地址,从而执行从抽象命令解析、翻译、预装填到抽象命令相关字段所指定的不同存储空间的调试命令。
GCXP-1A用户调试模块的逻辑架构主要实现用户程序异常中断调试、提供断点环境通用寄存器及CSR寄存器的访问、提供SoC总线上外设I/O寄存器或存储器的访问。具体如下:
1)DM_TRANSPORT模块负责JTAG TAP状态机的实现,以及上位机指令操作向DM_ROUTER模块内部总线的转写,主要分为DM_TRASNPORT寄存器访问和DM内部总线访问,前者主要是标识调试协议实现版本,后者用于交互具体的调试任务。
当TAP状态机进入Update-DR状态,IR寄存器的值为DMI_ACCESS(5’h11),且当前调试系统总线(Debug Message Interface,DMI)接口没有错误信息时,开始执行dmi.op指定的操作。
如图 2所示,当dmi.op=0x1,dmi状态机进入Read状态。在Read状态中,先将dmi_req_valid信号拉高,再等待dmi_req_ready信号为高时进入WaitReadValid状态。在WaitReadValid状态中等待dmi_resp_valid信号为高,当该信号为高时,dmi读取DM模块回应的数据(dmi_resp.data),并返回Idle状态。当dmi.op=0x2,dmi状态机进入Write状态。在Write状态中,先将dmi_req_valid信号拉高,再等待dmi_req_valid信号为高时返回Idle状态。
![]() |
Download:
|
图 2 JTAG转DMI内部总线状态机 Fig. 2 JTAG to DMI internal bus state machine |
2)DM_ROUTER模块负责上位机通过JTAG DMI_ ACCESS访问填充的抽象调试寄存器内容,图 3为其功能逻辑图,将调试任务依据抽象命令对应标志位,通过内部总线发送到具体部件执行。
![]() |
Download:
|
图 3 DM_ROUTER功能流程 Fig. 3 Procedure of DM_ROUTER function |
3)DM_EXE模块接收并处理处理器内部信息的调试指令,图 4为其功能逻辑图,根据用户Halt指令、软件配置的硬件断点是否等于CPU Trace信号中PC值、单步调试指令标志情况,向外发出调试中断信号,同时完成调试目的寄存器访问路由,分别组织指令架构下通用寄存器访问、CSR寄存器访问的指令编码,并依据调试任务中标识的执行空间进行指令填充(结果目的地址为内部DATA寄存器),等待PC正确跳入取指执行,执行完毕标记完成位,上位机将DATA寄存器中的结果扫回。DM_EXE模块中的关键点是CPU、上位机、DM模块的三方协同状态机,从而保证作业正常流转。
![]() |
Download:
|
图 4 DM_EXE解析ABSTRACT_CMD以及填充指令槽位逻辑 Fig. 4 DM_EXE parsing ABSTRACT_CMD and filling instruction slot logic |
三方协同状态机设计如图 5所示,其中,左图主要描述DM_EXE硬件状态机,右图主要描述Debug Rom软件中断处理程序。中断可以由软件陷入或上位机调制命令通过DM发出,任何一种调试中断发起,即触发调试中断,PC跳入调试中断入口程序(Debug Rom),首先挪用一个通用寄存器,再将标定调试的Core_Id写入DM Halted寄存器,硬件状态机确认选中的CPU已经被停住,此时,若上位机发送了调试命令,则DM将CMD_BUSY拉高,进入下一状态,否则停留在IDLE,在Debug Rom程序go与resume都等于0的情况下会在Debug Rom程序空间死循环,等待调试指令到来。
![]() |
Download:
|
图 5 DM_EXE软硬协同状态机 Fig. 5 DM_EXE software and hardware collaborative state machine |
当上位机调试指令到来,CMD_BUSY信号随即拉高,DM_EXE状态机进入GO状态,此时等待Debug Rom程序填写DM寄存器going为1,此处设计是因为调试指令一般由1~2条组成,并且为硬件寄存器装填,1个CLK周期就能完成,在GCXP-1A 5级流水线设计下,一条指令执行周期即可保证指令硬件装填完毕,Debug Rom执行DM go寄存器判断这条指令周期就足以满足,因此,这里不再做DM指令槽位填充完毕握手机制。状态机检测到Going地址有写操作后,随即PC获取一条跳转指令,跳入DM_EXE取指入口(where to go),根据上位机指令标记获取跳入不同DM内部指令槽入口的跳转指令,从而执行调试任务,指令槽位最后一条指令必然为跳回Debug Rom首地址,通过再次写Halted地址进入Idle状态。复位三方握手流程类似,不再详细描述。
4)DM_SBA模块实现一个总线的Master端,从而使得DM模块能够访问SoC总线下编址地址信息读写。DM_SBA的总体功能逻辑结构如图 6所示。
![]() |
Download:
|
图 6 DM_SBA模块功能逻辑 Fig. 6 DM_SBA module function logic |
DM_SBA模块的读写过程用一个状态机实现,有idle、write、read、waite_write、waite_read这5种状态。状态机的转换示意图如图 7所示,Idle为master接口处于空闲状态,write为master接口往内存写数据,read为master接口向内存读取数据,waite_write和waite_read分别为master接口的读、写等待状态。
![]() |
Download:
|
图 7 DM_SBA工作状态机 Fig. 7 DM_SBA working state machine |
GCXP软件特权架构有3种特权级:1)硬件模式(Hadware Mode,HM),是最高权限模式,为特权程序运行环境;2)内核模式(Kernel Mode,KM),是次低级模式,为操作系统运行环境;3)用户模式(User Mode,UM),是最低级模式,为用户程序运行环境。
特权程序运行程序(SW-HMCODE)为代替硬件逻辑的软件代码,定义了平台SYS_CALL,注册了操作系统核心对应的特权异常、中断处理入口地址,在扩展处理器功能实验、规避硬件错误以及OS调试上都有重要的地位,是一种GCXP独有的软硬件协同机制,默认为绝对正确,保证程序不会挂死在HM模式下,且对用户透明。
RISCV Debug Spec中所涉及的CPU硬件中断处理、调试模式及其配套的DPC、DCSR,在GCXP GCXP-1A软硬件环境下都进行了重新设计,与GCXP-1A HMCODE相结合,调试中断改为普通中断,通过HMCODE中断处理流程,实现现场保护和复原,并在HMCODE中设置专用SYS_CALL入口,结合中断控制器,与普通中断跳入操作系统核心注册处理程序不同,调试中断处理程序(DM_ROM)在HMCODE内部进行调试中断识别并完成跳转,从而实现软硬件调试陷入。
在上位机OpenOCD中,由于兼容RISCV Debug Spec 0.13.2,因此按照RISCV Debug Spec 0.13.2的软件流程,添加th1a-013 target分支,注册寄存器读写、内存地址读写以及programbuf、abstract commad函数读写等,从而完善用户调试流程。
3 验证分析 3.1 GCXP-1A调试模块模拟验证如图 8所示,GCXP-1A调试模块模拟验证环境由3个部分组成,分别为:1)SimJTAG.sv包含Jtag_tick DPI-C接口,负责路由来自DPI-C的JTAG引脚信号,并与GCXP-1A SOC DM JTAG桥接;2)DPI-C接口具体实现本机socket注册、监听和链接接受服务,使用bitbang协议将socket调试请求转换成JTAG信号;3)上位机调试软件通过DPI-C暴露的本地端口链接,开展调试流程。
![]() |
Download:
|
图 8 调试模块模拟验证环境逻辑结构 Fig. 8 Debugging module simulation verification environment logical structure |
如图 9所示,在模拟验证环境下,激励时钟起震、复位撤销前使用HMCODE+TEST_CODE HEX进行约定地址空间布数。软件流程具体如下:1)CPU从HMCODE开始取指运行,跳转到TEST_CODE地址;2)TEST_CODE配置CSR寄存器打开调试中断使能;3)跳出HM模式,运行死循环;4)HMCODE根据CPU捕获的中断(CPU保证流水线硬件冲刷),将PC跳转到Debug ROM HALT地址执行;5)上位机执行调试作业;6)Debug退出,执行Debug ROM resume程序段,恢复现场,跳转PC到保留PC。
![]() |
Download:
|
图 9 模拟验证环境软件逻辑结构 Fig. 9 Simulation verification environment software logical structure |
基于Synopsys VCS 2018.09-SP2开展GCXP-1A SoC模拟验证,针对dm开展OpenOCD test_compliance测试集验证,针对所设计的功能,波形日志如下:
1)调试中断流程。
如图 10所示,当上位机中断请求发起,dm模块io_debug_req_o信号拉高,由HMCODE中断现场保护,并跳转PC到0x100调试处理程序首地址,执行118地址的写hart id(0)到dm 0x400(Halted_aligned)地址,dm状态机检测到该写操作后随即拉高halted_q信号,标识CPU已经成功响应调试中断。
![]() |
Download:
|
图 10 模拟环境调试中断响应波形图 Fig. 10 Simulated environment debugging interrupt response waveform |
2)CPU内部寄存器读写。
如图 11所示,state_q为上文描述的三方交互状态机状态寄存器,分别标识idle(0)、go(1)、resume(2)、excuting(3),调试指令下达后,由idle- > go状态,并等待debug rom程序写going地址,期间硬件完成abstract_cmd任务指令转译和填充,在going拉高后跳入excuting阶段,执行完毕后(指令槽位最后一条固定位回到debug rom首地址),等待debug rom再次写halted_align地址,从而回到Idle状态。
![]() |
Download:
|
图 11 模拟环境abstract cmd CPU内部寄存器读写 Fig. 11 Simulated environment abstract cmd CPU internal register read and write |
3)SBA总线地址访问。
如图 12所示,上位机通过OpenOCD对总线上的地址进行读写访问,dm_sba模块从dm_csr路由信号操作axi4 master读写时序,从而完成读写任务。
![]() |
Download:
|
图 12 模拟环境SBA时序 Fig. 12 Simulation environment SBA time limit |
FPGA验证环境为KCU105,将设计中的JTAG引脚约束到FMC XM105扩展卡引脚,链接JLink v9,DM模块挂在系统总线下。在Vivado 2019.2环境下开展SoC综合仿真实验,运行频率为100 MHz。
在仿真过程中,需要HMCODE逻辑配合,在不依赖linux kernel的情况下识别响应调试中断。实验环境如图 13所示。
![]() |
Download:
|
图 13 GCXP SoC DM+JLINKV9+OpenOCD验证平台 Fig. 13 GCXP SoC DM+JLINKV9+OpenOCD verification platform |
在图 14中,使用OpenOCD客户端链接JLNK开展DM功能测试实验,图 14(a)测试内容为通用寄存器或CSR寄存器读写功能,图中示例使用OpenOCD寄存器读写命令读写寄存器,图 14(b)测试内容为SoC总线地址空间存储器读写功能,使用OpenOCD SBA模式测试字读写。
![]() |
Download:
|
图 14 OpenOCD命令行操作示例 Fig. 14 OpenOCD command line operation example |
覆盖率是判断DUT验证是否完备的重要指标,在数字集成电路设计中,覆盖率分为代码覆盖率和功能覆盖率,代码覆盖率表征每行代码的执行情况,功能覆盖率表征具备一定功能的代码组合的执行情况。从图 15可以看出,本文DM模块的代码及功能覆盖率都能达到100%,能够满足流片要求。
![]() |
Download:
|
图 15 代码及功能覆盖率 Fig. 15 Code and function coverage rate |
本文在RISCV调试协议规范的基础上,结合GC,使用GCXP的HMCODE机制实现一套轻量级且对CPU无设计需求的调试方案,该方案可以兼容GCXP全系列CPU IP产品以及RISCV的调试软件和转接器,从而丰富自主芯片的调试生态。下一步将协同CPU设计Trace模式,实现CPU非入侵式调试机制,完成可控可过滤的指令流、数据流跟踪,此外,配套上位机程序开发,实现性能可分析观测、功能完备且安全的用户调试机制,也是今后的研究方向。
[1] |
HOPKINS A B T, MCDONALD-MAIER K D. Debug support for complex systems on-chip: a review[J]. IEEE Proceedings-Computers and Digital Techniques, 2006, 153(4): 197. DOI:10.1049/ip-cdt:20050194 |
[2] |
VERMEULEN B, GOEL S K. Design for debug: catching design errors in digital chips[J]. IEEE Design & Test of Computers, 2002, 19(3): 35-43. |
[3] |
VERGÉ A, EZZATI-JIVAN N, DAGENAIS M R. Hardware-assisted software event tracing[J]. Concurrency and Computation: Practice and Experience, 2017, 29(10): e4069. DOI:10.1002/cpe.4069 |
[4] |
Intel. 64 and IA-32 architectures software developer's manual[EB/OL]. [2021-08-05]. https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-archit-ectures-software-developer-instruction-set-reference-manual-325383.pdf.
|
[5] |
Intel. Architecture instruction set extensions and future features programming reference[EB/OL]. [2021-08-05]. https://software.intel.com/sites/default/files/managed/c5/15/architectu-reinstruction-set-extensions-programming-reference.pdf.
|
[6] |
SCHUMILO S, ASCHERMANN C, GAWLIK R, et al. kAFL: hardware-assisted feedback fuzzing for OS kernels[EB/OL]. [2021-08-05]. https://etit.ruhr-uni-bochum.de/media/emma/veroeffentlichungen/2017/08/16/usenix17-kAFL.pdf.
|
[7] |
XU J, MU D, XING X, et al. POMP: postmortem program analysis with hardware-enhanced post-crash artifacts[C]//Proceedings of the 26th USENIX Conference on Security Symposium. San Diego, USA: USENIX Association, 2017: 17-32.
|
[8] |
ARM. Architecture reference manual ARMv7-A and ARMv7-R edition-n[EB/OL]. [2021-08-05]. http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0406c/index.html.
|
[9] |
ARM. ARMv8-A reference manual[EB/OL]. [2021-08-05]. http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0487a.k/index.html.
|
[10] |
ARM. Embedded trace macrocell architecture specification[EB/OL]. [2021-08-05]. http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0014q/index.html.
|
[11] |
ARM. Embedded cross trigger[EB/OL]. [2021-08-05]. http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0314h/Babhjchd.html.
|
[12] |
IEEE. Standard for test access port and boundary-scan architecture: IEEE Std 1149.1-2013[S]. Washington D. C., USA: IEEE Press, 2010.
|
[13] |
System debugger[EB/OL]. [2021-08-05]. https://software.intel.com/en-us/system-studio/system-debugger.
|
[14] |
ARM. DS-5 development studio[EB/OL]. [2021-08-05]. https://developer.arm.com/products/software-development-tools/ds-5-development-studio.
|
[15] |
OpenOCD. Open on-chip debugger[EB/OL]. [2021-08-05]. http://openocd.org/.
|
[16] |
RISCV. Riscv-Debug-Spec[EB/OL]. [2021-08-05]. https://github.com/riscv/riscv-debug-spec/blob/release/riscv-debug-release.pdf.
|
[17] |
OpTiMSoC, lowRISC. Open SoC debug is a new project[EB/OL]. [2021-08-05]. https://opensocdebug.org/.
|
[18] |
RISCV. Riscv-Trace-Spec[EB/OL]. [2021-08-05]. https://raw.githubusercontent.com/riscv/riscv-trace-spec/e372bd36abc1b72ccbff31494a73a862367cbb29/riscv-trace-spec.pdf.
|
[19] |
胡向东, 董建萍. 实时监测处理器内部状态的装置: CN101187892A[P]. 2008-05-28. HU X D, DONG J P. Device for real-time monitoring inside of processor: CN101187892A[P]. 2008-05-28. (in Chinese) |
[20] |
李彦哲, 尹飞, 巨鹏锦. 芯片实时监测系统及其实现[C]//第十八届计算机工程与工艺年会暨第四届微处理器技术论坛论文集. 贵阳, 贵州: 中国计算机学会计算机工程与工艺专业委员会, 2014: 606-611. LI Y Z, YIN F, JU P J. Chip real-time monitoring system and its implementation[C]//Proceedings of the 18th Annual Conference of Computer Engineering and Technology and the 4th Microprocessor Technology Forum. Guiyang, Guizhou: Computer Engineering and Technology Committee of Chinese Computer Society, 2014: 606-611. (in Chinese) |
[21] |
程军. 基于等效移位寄存器的针对扫描链攻击的安全扫描设计[D]. 西安: 西安电子科技大学, 2014. CHENG J. Secure scan design against scan-based attacks based on shift register equivalents[D]. Xi'an: Xidian University, 2014. (in Chinese) |
[22] |
HSU Y C, TSAI F, JONG W, et al. Visibility enhancement for silicon debug[C]//Proceedings of the 43rd ACM/IEEE Design Automation Conference. Washington D. C., USA: IEEE Press, 2006: 13-18.
|