基于精简指令集计算机结构的解码异常检测方法以及装置
技术领域
本发明涉及一种解码异常检测技术,特别是一种基于精简指令集计算机结构的解码异常检测方法以及使用此方法的装置。
背景技术
由于网络传输的错误等原因,视频解码芯片需要处理不正确的码流(codestream),用以检测各种可能出错的情况以及让出错的解码单元可及时被结束,使得视频可正常被播放。这些解码异常可以出现在码流的各个部分,例如,序列头语句(sequenceheader syntax)、帧头语句(frame header syntax)、片头语句(slice header syntax)、宏块头语句(Macroblock header syntax)或各宏块的残差值等。
在基于精简指令集计算机(RISC,Reduced Instruction Set Computer)结构的视频解码芯片中,这种解码异常检测通常可藉由添加在着色器(shader)中的指令完成,亦即解码异常的软件检测。然而,解码异常的软件检测需要在着色器中添加大量的跳转指令,会大大降低视频解码的效率。
因此,需要一种基于精简指令集计算机结构的解码异常检测装置,可以避免在着色器中添加大量的跳转指令,并且在不影响视频解码效率的前提下,实现视频解码的异常检测,保证出错的码流可以正常播放。同时,该解码异常的硬件检测,又可与软件检测兼容,混合使用。
发明内容
本发明的实施例提出一种基于精简指令集计算机结构的解码异常检测装置,至少包含异常寄存器、执行级及计数单元。执行级耦接至异常寄存器,用以于每一时钟周期执行码流错误检测,一旦发现码流发生错误且无法纠错时,将异常寄存器中的值设为逻辑“1”,用以指示发生不可恢复的码流错误,并且忽略目前指令而不执行。计数单元耦接于异常寄存器及执行级之间,包含计数器,于每一时钟周期检查异常寄存器中的值是否为逻辑“1”;如果异常寄存器中的值为逻辑“1”,将计数器设为执行级需要忽略的指令数目。
本发明的实施例提出一种基于精简指令集计算机结构的解码异常检测方法,由执行级于每一时钟周期执行,包含以下步骤:接收码流;判断码流是否发生错误;以及当发现码流发生错误且无法纠错时,将异常寄存器中的值设为逻辑“1”,用以指示发生不可恢复的码流错误,以及忽略目前指令而不执行。
本发明的实施例提出一种基于精简指令集计算机结构的解码异常检测方法,由解码级于每一时钟周期执行,包含以下步骤:侦测到异常寄存器的值为逻辑“1”时,控制多工器,用以将跳转寄存器经由多工器耦接至指令提取级,使得指令提取级于下一时钟周期从跳转寄存器中指示的地址读取指令。
附图说明
图1是依据本发明实施例的基于精简指令集计算机结构的解码异常检测装置。
图2是依据本发明实施例的包含解码异常检测的7流水级精简指令集计算机的系统架构图。
图3是依据本发明实施例的基于精简指令集计算机结构的解码异常检测方法的流程图。
图4是依据本发明实施例的基于精简指令集计算机结构的解码异常检测方法的流程图。
具体实施方式
以下说明为完成发明的较佳实现方式,其目的在于描述本发明的基本精神,但并不用以限定本发明。实际的发明内容必须参考之后的权利要求范围。
必须了解的是,使用于本说明书中的“包含”、“包括”等词,用以表示存在特定的技术特征、数值、方法步骤、作业处理、组件以及/或组件,但并不排除可加上更多的技术特征、数值、方法步骤、作业处理、组件、组件,或以上的任意组合。
在权利要求中使用如“第一”、“第二”、“第三”等词是用来修饰权利要求中的组件,并非用来表示之间具有优先权顺序,先行关系,或者是一个组件先于另一个组件,或者是执行方法步骤时的时间先后顺序,仅用来区别具有相同名字的组件。
本发明实施例提出了一种基于精简指令集计算机结构的解码异常检测装置。图1是依据本发明实施例的基于精简指令集计算机结构的解码异常检测装置的方块图。解码异常检测装置包含异常寄存器(error register)110、执行级(EX,Execution)120及计数单元(counting unit)130。执行级120耦接至异常寄存器110,用以于每一时钟周期执行码流错误检测,一旦发现码流发生错误且无法纠错时,将异常寄存器110的值设为逻辑“1”,用以指示发生不可恢复的码流错误,并且忽略目前指令而不执行。计数单元130包含计数器131,并且耦接于异常寄存器110及执行级120之间。于每一时钟周期检查异常寄存器110的值是否为逻辑“1”;如果异常寄存器110的值为逻辑“1”,将计数器131设为执行级120需要忽略的指令数目。
图2是依据本发明实施例的包含解码异常检测的7流水级(pipe-stages)精简指令集计算机的系统架构图。7个流水级可包含指令提取级(IF,InstructionFetch)211、指令存取级(IA,Instruction Access)212、解码级(DE,Decode)213、第0阶段执行级(EX0,Execution 0)214、第1阶段执行级(EX1,Execution 1)215、第2阶段执行级(EX2,Execution2)216及回写级(WB,Write Back)217。程序计数器(PC,Program Counter)220为一种寄存器,负责存放目前指令的地址。跳转寄存器230(命名为SR_BrPC)用于存放一旦出现解码异常时,需要跳转到的指令的地址,着色器可使用特殊的跳转指令将此地址设定到跳转寄存器230。特殊的跳转指令通常由执行级214执行。例如,跳转指令可为“JUMPJumpLabel”,其中,“JumpLabel”指示着色器中的特定标签。此地址为出错处理函数(error handler)的起始地址。指令提取级211可经由多工器(MUX,multiplexer)240从程序计数器220或跳转寄存器230读取地址。指令存取级212依据读取指令从指令高速缓存(instruction cache)提取一个指令,此指令可为16位、32位或64位。所有指令可能拥有一至多个寄存器输入。解码级213辨识指令中的寄存器,以及读取寄存器中的值。执行级214至216中的任一个包含运算逻辑单元(ALU,Arithmetic and Logic Unit)以及位移器(bit shifter)。运算逻辑单元负责执行布尔运算(如AND、OR、NOT、NAND、NOR、XOR、XNOR等),而位移器负责位移运算及位旋转。回写级217将计算结果写入寄存器文档(register file)。
异常寄存器250(命名为SR_ErFlag)用于存放是否出现解码异常的旗标位(flagbit)。执行级214至216中的任一个于执行指令时都会执行码流错误检测,例如,奇偶校验(Parity Check)、错误检查与校正(ECC,Error Checking and Correction)等。一旦发现码流发生错误且无法纠错时,执行级将异常寄存器250中的值设为逻辑“1”,用以指示发生不可恢复的码流错误,并且忽略目前指令而不执行。执行级214至216中的码流错误检测可依据视频标准不同具有不同的检测目标。码流错误检测可置入于特定的码流解码阶段中,例如序列头语句(sequence header syntax)解码、帧头语句(frame header syntax)解码、片头语句(slice header syntax)解码、宏块头语句(Macroblock header syntax)解码或各宏块的残差值解码等。以H.264标准为例,表1列出几个错误检测的例子:
表1
伪指令 |
出错情况 |
Dec_SliceType R1 |
片类型不在合法范围[0,9] |
Dec_Qp R2 |
Qp不在合法范围[0,51] |
Dec_mvd R3,0 |
Mvd_y不在合法范围[-512,511.75] |
当异常寄存器250中的值设为逻辑“1”时,亦表示执行级214至216需要一段时间的跳转保护。解码级213不断检查异常寄存器250中的值是否为逻辑“1”。如果是,解码级213指示指令提取级211于下一个时钟周期读取跳转寄存器230中存放的地址以及将异常寄存器250中的值设为逻辑“0”。具体来说,解码级213控制多工器240,用以将跳转寄存器230连接至指令提取级211,使得指令提取级211在下一个时钟周期从跳转寄存器230读取地址。此外,计数单元(counting unit)271连接在执行级214及异常寄存器250之间,在每一个时钟周期,一旦侦测到异常寄存器250中的值为逻辑“1”,将计数单元271中的计数器(counter)设为执行级214需要忽略的指令数目,例如4。计数单元272连接在执行级215及异常寄存器250之间,在每一个时钟周期,一旦侦测到异常寄存器250中的值为逻辑“1”,将计数单元272中的计数器设为执行级215需要忽略的指令数目,例如5。计数单元273连接在执行级216及异常寄存器250之间,在每一个时钟周期,一旦侦测到异常寄存器250中的值为逻辑“1”,将计数单元273中的计数器设为执行级216需要忽略的指令数目,例如6。当计数单元271、272及273中的每一个在每一个时钟周期侦测到异常寄存器250中的值为逻辑“0”且其中的计数器的值大于0时,将计数器的值减1。执行级214至216于执行指令前,分别检查计数单元271至273中的计数器的值是否大于0,若是,则忽略目前指令而不执行。
图3是依据本发明实施例的基于精简指令集计算机结构的解码异常检测方法的流程图,由执行级214至216中的任一个在每一时钟周期执行。取得码流(步骤S310),并且判断码流是否发生错误且无法纠错(步骤S320)。当发现码流发生错误且无法纠错时(步骤S320中“是”的路径),将异常寄存器250的值设为逻辑“1”,用以指示发生不可恢复的码流错误,以及忽略目前指令而不执行(步骤S330)。反之(步骤S320中“否”的路径),判断相应计数单元271、272或273的计数器的值是否大于0(步骤S340)。当相应计数单元中的计数器的值大于0时(步骤S340中“是”的路径),忽略目前指令而不执行(步骤S350);反之(步骤S340中“否”的路径),执行目前指令(步骤S360)。
图4是依据本发明实施例的基于精简指令集计算机结构的解码异常检测方法的流程图,由解码级213于每一时钟周期执行。读取异常寄存器250的值(步骤S410),以及判断异常寄存器250的值是否为逻辑“1”(步骤S420)。当异常寄存器250的值为逻辑“1”时(步骤S420中“是”的路径),控制多工器240,用以将跳转寄存器230经由多工器240耦接至指令提取级211,使得指令提取级211于下一时钟周期从跳转寄存器230中指示的地址读取指令(步骤S430)。
表2显示于执行级214中检测到码流错误后的整个流水线运行:
表2
表2描述每一级于不同时钟周期执行指令的地址,“PC”或“Er”代表发现错误的地址,“Br”代表跳转寄存器230储存的地址,以及数字代表字节(bytes)的数目。假设执行级214于时钟周期#n发现码流发生错误且无法纠错,表示为“PC/Er”:执行级214将异常寄存器250中的值设为逻辑“1”。解码级213于时钟周期#n+1发现异常寄存器250中的值为逻辑“1”时,控制多工器240用以将跳转寄存器230连接至指令提取级211,接着,将异常寄存器250中的值为逻辑“0”。此外,计数单元271至273于时钟周期#n+1发现异常寄存器250中的值为逻辑“1”时,将其中的计数器分别设为4、5及6。在此须注意的是,于时钟周期#n+1,计数单元271至273对其中的计数器的设定在解码级213将异常寄存器250中的值设为逻辑“0”之前。另在此须注意的是,通过参考计数单元271中的计数器,执行级214于时钟周期#n+1至#n+4忽略指令而不执行。通过参考计数单元272中的计数器,执行级215于时钟周期#n+1至#n+5忽略指令而不执行。通过参考计数单元273中的计数器,执行级216于时钟周期#n+1至#n+6忽略指令而不执行。
表3显示于执行级215中检测到码流错误后的整个流水线运行:
表3
Cyc |
#n |
#n+1 |
#n+2 |
#n+3 |
#n+4 |
#n+5 |
#n+6 |
#n+7 |
WB |
|
|
|
|
|
|
|
|
EX2 |
PC-4 |
PC/Er |
Er+4 |
Er+8 |
Er+12 |
Er+16 |
Er+20 |
Br |
EX1 |
PC/Er |
Er+4 |
Er+8 |
Er+12 |
Er+16 |
Er+20 |
Br |
Br+4 |
EX0 |
Er+4 |
Er+8 |
Er+12 |
Er+16 |
Er+20 |
Br |
Br+4 |
Br+8 |
DE |
Er+8 |
Er+12 |
Er+16 |
Er+20 |
Br |
Br+4 |
Br+8 |
Br+12 |
IA |
Er+12 |
Er+16 |
Er+20 |
Br |
Br+4 |
Br+8 |
Br+12 |
Br+16 |
IF |
Er+16 |
Er+20 |
Br |
Br+4 |
Br+8 |
Br+12 |
Br+16 |
Br+20 |
表3描述每一级于不同时钟周期执行指令的地址。假设执行级215于时钟周期#n发现码流发生错误且无法纠错,表示为“PC/Er”:执行级215将异常寄存器250中的值设为逻辑“1”。解码级213于时钟周期#n+1发现异常寄存器250中的值为逻辑“1”时,控制多工器240用以将跳转寄存器230连接至指令提取级211,接着,将异常寄存器250中的值为逻辑“0”。此外,计数单元271至273于时钟周期#n+1发现异常寄存器250中的值为逻辑“1”时,将其中的计数器分别设为4、5及6。在此须注意的是,于时钟周期#n+1,计数单元271至273对其中的计数器的设定在解码级213将异常寄存器250中的值设为逻辑“0”之前。另在此须注意的是,通过参考计数单元271中的计数器,执行级214于时钟周期#n+1至#n+4忽略指令而不执行。通过参考计数单元272中的计数器,执行级215于时钟周期#n+1至#n+5忽略指令而不执行。通过参考计数单元273中的计数器,执行级216于时钟周期#n+1至#n+6忽略指令而不执行。
表4显示于执行级216中检测到码流错误后的整个流水线运行:
表4
Cyc |
#n |
#n+1 |
#n+2 |
#n+3 |
#n+4 |
#n+5 |
#n+6 |
#n+7 |
WB |
|
|
|
|
|
|
|
|
EX2 |
PC/Er |
Er+4 |
Er+8 |
Er+12 |
Er+16 |
Er+20 |
Er+24 |
Br |
EX1 |
Er+4 |
Er+8 |
Er+12 |
Er+16 |
Er+20 |
Er+24 |
Br |
Br+4 |
EX0 |
Er+8 |
Er+12 |
Er+16 |
Er+20 |
Er+24 |
Br |
Br+4 |
Br+8 |
DE |
Er+12 |
Er+16 |
Er+20 |
Er+24 |
Br |
Br+4 |
Br+8 |
Br+12 |
IA |
Er+16 |
Er+20 |
Er+24 |
Br |
Br+4 |
Br+8 |
Br+12 |
Br+16 |
IF |
Er+20 |
Er+24 |
Br |
Br+4 |
Br+8 |
Br+12 |
Br+16 |
Br+20 |
表4描述每一级于不同时钟周期执行指令的地址。假设执行级216于时钟周期#n发现码流发生错误且无法纠错,表示为“PC/Er”:执行级216将异常寄存器250中的值设为逻辑“1”。解码级213于时钟周期#n+1发现异常寄存器250中的值为逻辑“1”时,控制多工器240用以将跳转寄存器230连接至指令提取级211,接着,将异常寄存器250中的值为逻辑“0”。此外,计数单元271至273于时钟周期#n+1发现异常寄存器250中的值为逻辑“1”时,将其中的计数器分别设为4、5及6。在此须注意的是,于时钟周期#n+1,计数单元271至273对其中的计数器的设定在解码级213将异常寄存器250中的值设为逻辑“0”之前。另在此须注意的是,通过参考计数单元271中的计数器,执行级214于时钟周期#n+1至#n+4忽略指令而不执行。通过参考计数单元272中的计数器,执行级215于时钟周期#n+1至#n+5忽略指令而不执行。通过参考计数单元273中的计数器,执行级216于时钟周期#n+1至#n+6忽略指令而不执行。
虽然图1及图2中包含了以上描述的组件,但不排除在不违反本发明的精神下,使用更多其它的附加组件,以达成更佳的技术效果。此外,虽然图3至图4的处理步骤采用特定的顺序来执行,但是在不违反发明精神的情况下,熟习此技艺人士可以在达到相同效果的前提下,修改这些步骤间的顺序,所以,本发明并不局限于仅使用如上所述的顺序。
虽然本发明使用以上实施例进行说明,但需要注意的是,这些描述并非用以限缩本发明。相反地,此发明涵盖了熟习此技艺人士显而易见的修改与相似设置。所以,本发明权利要求范围须以最宽广的方式解释来包含所有显而易见的修改与相似设置。
【符号说明】
110 异常寄存器;
120 执行级;
130 计数单元;
131 计数器;
211 指令提取级;
212 指令存取级;
213 解码级;
214、215、216 执行级;
217 回写级;
220 程序计数器;
230 跳转寄存器;
240 多工器;
250 异常寄存器;
271、272、273 计数单元;
S310~S360 方法步骤;
S410~S430 方法步骤。