• Rocket


    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。

     

  • 相关阅读:
    find the most comfortable road
    Rank of Tetris
    Segment set
    Codeforces Round #380 (Div. 2)D. Sea Battle
    A Bug's Life
    Is It A Tree?
    N皇后问题
    符号三角形
    2016 ICPC总结
    Sudoku Killer
  • 原文地址:https://www.cnblogs.com/wjcdx/p/11632610.html
Copyright © 2020-2023  润新知