CN113488099A - Dsp寄存器访问冲突处理方法 - Google Patents
Dsp寄存器访问冲突处理方法 Download PDFInfo
- Publication number
- CN113488099A CN113488099A CN202110654787.3A CN202110654787A CN113488099A CN 113488099 A CN113488099 A CN 113488099A CN 202110654787 A CN202110654787 A CN 202110654787A CN 113488099 A CN113488099 A CN 113488099A
- Authority
- CN
- China
- Prior art keywords
- access request
- flag bit
- pipeline
- register
- bus
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000003672 processing method Methods 0.000 title claims abstract description 9
- 238000000034 method Methods 0.000 claims description 12
- 238000012545 processing Methods 0.000 description 4
- 238000013461 design Methods 0.000 description 2
- 101000618467 Hypocrea jecorina (strain ATCC 56765 / BCRC 32924 / NRRL 11460 / Rut C-30) Endo-1,4-beta-xylanase 2 Proteins 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000008092 positive effect Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G11—INFORMATION STORAGE
- G11C—STATIC STORES
- G11C19/00—Digital stores in which the information is moved stepwise, e.g. shift registers
- G11C19/28—Digital stores in which the information is moved stepwise, e.g. shift registers using semiconductor elements
Landscapes
- Advance Control (AREA)
Abstract
DSP寄存器访问冲突处理方法,包括接收第一总线传送的第一访问请求,记录第一目标寄存器ID;接收第二总线传送的第二访问请求,记录第二目标寄存器ID;读取第一、第二状态标志位并判断是否有至少一个处于置位状态;若是,则判断第一、第二目标寄存器ID是否相同;若相同,则判定为发生寄存器访问冲突;置位停顿状态标志位,配置流水线停顿取指、译码和预测,执行第一访问请求对应的读操作或写操作;生成标志位清除使能并清除第一、第二状态标志位;判断第一、第二状态标志位是否均处于复位状态;若是,执行第二访问请求对应的读寄存器操作或写寄存器操作,复位停顿状态标志位,流水线恢复。本发明确保不会连续产生访问冲突,指令的执行顺序符合预期。
Description
技术领域
本发明属于芯片设计和制造技术领域,尤其涉及一种DSP寄存器访问冲突处理方法。
背景技术
DSP内部寄存器发生访问冲突时,现有的方式是处理器将优先级低的访问缓存,先处理优先级高的访问请求。但在实际应用中,可能会出现连续冲突,这导致优先级低的访问一直被缓存,直至冲突结束。这样的处理方式存在一定概率导致指令序列的实际执行顺序与预期顺序不同,导致数据处理结果产生差异。
发明内容
本发明针对现有技术中出现连续寄存器访问冲突时,优先级低的访问一直被缓存,导致指令序列的实际执行顺序与预期顺序不同,数据处理结果产生差异的问题,设计并提供一种DSP寄存器访问冲突处理方法。
为实现上述发明目的,本发明采用下述技术方案予以实现:
一种DSP寄存器访问冲突处理方法,包括以下步骤:接收第一总线传送的第一访问请求,所述第一访问请求配置为执行对第一目标寄存器的读操作或写操作,记录第一目标寄存器ID;接收第二总线传送的第二访问请求,所述第二访问请求配置为执行对第二目标寄存器的读操作或写操作,记录第二目标寄存器ID;读取与第一访问请求对应的第一状态标志位以及与第二访问请求对应的第二状态标志位,并判断是否有至少一个处于置位状态;如果所述第一状态标志位以及第二状态标志位有至少一个处于置位状态,则判断所述第一目标寄存器ID与第二目标寄存器ID是否相同;如果第一目标寄存器ID与第二目标寄存器ID相同,则判定为发生寄存器访问冲突;置位停顿状态标志位,配置流水线停顿取指、译码和预测,执行所述第一访问请求对应的读操作或写操作;根据读操作或者写操作生成标志位清除使能并清除所述第一状态标志位和第二状态标志位;判断第一状态标志位和第二状态标志位是否均处于复位状态;如果第一状态标志位和第二状态标志位均处于复位状态,执行第二访问请求对应的读寄存器操作或写寄存器操作,复位停顿状态标志位,流水线恢复。
与现有技术相比,本发明的优点和积极效果是:
本发明所提供的DSP寄存器访问冲突处理方法,在寄存器访问冲突时,置位停顿状态标志位stall迫使流水线取指,译码、预测等阶段的停顿。由于流水线停顿,因此没有新的指令进入流水线,进而保证不会连续产生访问冲突。同时,DSP处理器内部按照引发冲突的访问顺序依次对寄存器完成访问。其后复位stall信号,撤销停顿申请。流水线恢复后继续取指,这保证了指令的执行顺序与预期一致。
结合附图阅读本发明的具体实施方式后,本发明的其他特点和优点将变得更加清楚。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1 为本发明所提供的DSP寄存器访问冲突处理方法的流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下将结合附图和实施例,对本发明作进一步详细说明。
需要说明的是,在本发明的描述中,术语“上”、“下”、“左”、“右”、“竖”、“横”、“内”、“外”等指示的方向或位置关系的术语是基于附图所示的方向或位置关系,这仅仅是为了便于描述,而不是指示或暗示所述装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性。
对于DSP处理器来说,一种可行的指令行格式为128位,每一个指令行分为4个指令单元,每个指令单元是32位。指令单元是指令的最小单元,一个指令单元可以实现一条简单指令。一个指令行可以同时进行4个简单操作,也可以只进行一个简单操作,后边的3个指令单元按照默认的空指令填充。对应的,所采用的总线系统包括第一总线和第二总线,第一总线和第二总线作为与各个寄存器、运算部件和内部模块之间传送信息的共同通信干线。为便于描述,定义第一总线为J总线,定义第二总线为K总线。J总线和K总线可以同时用于对寄存器进行访问。为了访问目标寄存器,一个指令行中可能有两个针对同一寄存器的操作,例如,在一个指令行中定义寄存器A=J5;寄存器A=K5,即同时进行2个写操作;或者在一个指令行中定义寄存器A=J5;K5=寄存器A,即同时进行1个读操作,1个写操作,当然,还有可能是两个读操作。对于寄存器A来说,即在一个指令行中有两个访问操作,存在访问冲突。除了一个指令行的两个访问操作导致的访问冲突之外,还有可能是分别在两个指令行中的两个访问操作导致的访问冲突,第一个指令行中对寄存器A的访问操作未完成,第二个指令行中即产生另一个对寄存器A的访问指令,这也会导致访问冲突。本发明所提供的方法即用于处理这一问题。此外,需要说明的是,如果一个指令行中包含两个利用同一总线传送的访问操作,例如寄存器A=J5;寄存器A=J6,这种指令的语法是非法的,在编译时无法产生处理器需要的指令码,无法通过编译阶段,不会引起寄存器访问冲突。
如图1所示,本发明所提供的DSP寄存器访问冲突处理方法,具体包括以下步骤:
步骤S11,接收第一总线(J总线)传送的第一访问请求,第一访问请求配置为执行对第一目标寄存器的读操作或者写操作,记录第一目标寄存器ID。
对于本发明中所提供的DSP处理器采用流水线架构,流水线架构至少包括I级、A级、EX1级、EX2级(流水线第一执行级)和EX3级(流水线第二执行级)。DSP处理器内部模块,例如运算部件等,在流水线I级发出访问某一个寄存器的访问请求。流水线A级判定访问请求能否传递到第一总线(J总线)或第二总线(K总线),即能否传送到J总线或者K总线上。通常来说,如果J总线或者K总线没有停顿就能传到第一总线(J总线)或者第二总线(K总线)上,如果J总线或者K总线停顿,则访问请求会保持,直到停顿消除。EX1级相当于是一个空闲,以减少数据路径的长度。流水线第一执行级EX2级和流水线第二执行级EX3级将在下文中进行详细介绍。
步骤S22,类似的,接收第二总线(K总线)传送的第二访问请求,第二访问请求配置为执行对第二目标寄存器的读操作或者写操作,记录第二目标寄存器ID。
寄存器本身和寄存器ID是一一对应的关系,寄存器ID由软件编译规则自行生成,例如上文示例中指出的寄存器A, A即为寄存器ID。
第一访问请求触发第一状态标志位flag_j置位,即第一状态标志位flag_j拉高,由0变为1。第二访问请求则触发第二状态标志位flag_k置位,即第二状态标志位flag_k拉高,由0变为1。
第一总线(J总线)传送的第一访问请求和第一目标寄存器ID顺流水线送至流水线第一执行级(EX2级)。
第二总线(K总线)传送的第二访问请求和第二目标寄存器ID顺流水线送至流水线第一执行级(EX2级)。
步骤S13,流水线第一执行级(EX2级)读取与第一访问请求对应的第一状态标志位flag_j以及与第二访问请求对应的第二状态标志位flag_k,并判断是否有至少一个处于置位状态。由于第一访问请求和第二访问请求可能是来源于不同的指令行,具有时间差,且需要在读操作或者写操作完成之后根据清除使能和寄存器ID对状态标志位进行清除。因此,认为至少第一状态标志位flag_j和第二状态标志位flag_k中有一个处于置位状态,即可能存在寄存器冲突。
步骤S14,进一步的,如果第一状态标志位flag_j以及第二状态标志位flag_k有至少一个处于置位状态,进一步判断第一目标寄存器ID与第二目标寄存器ID是否相同,即判断目标寄存器ID是否与在先引起第一状态标志位flag_j和/或第二状态标志位flag_k置位的寄存器ID是否相同。具体来说,例如第一访问请求为寄存器A=j5,第一访问请求触发第一状态标志位flag_j置位。满足第一状态标志位flag_j和第二状态标志位flag_k中有一个处于置位状态的条件。如果此时,第二总线(K总线)K输出第二访问请求,例如寄存器A=K5,此时即会对第二访问请求中的第二目标寄存器ID进行判定。在本例中,第二目标寄存器ID与第一目标寄存器ID相同,均为A。
步骤S15,在第一目标寄存器ID与第二目标寄存器ID相同时,即判定为发生寄存器访问冲突。如果第一目标寄存器ID与第二目标寄存器ID不同,则不发生寄存器访问冲突,根据读操作或者写操作完成指令即可。延续上述举例,如果第二访问请求为寄存器B=K5,即不发生寄存器访问冲突,可以正常执行第一访问请求和第二访问请求对应的读操作或者写操作。
步骤S16,在确定发生寄存器访问冲突的条件下,置位停顿状态标志位stall,配置流水线停顿取指、译码和预测,保持执行阶段不停顿,执行第一访问请求对应的读操作或者写操作。
步骤S17,根据读操作或者写操作生成标志位清除使能,并在流水线第二执行级(EX3级)执行清除第一状态标志位flag_j和第二状态标志位flag_k。
以下针对读操作和写操作分别进行介绍。
如果第一访问请求配置为执行读操作,流水线第一执行级(EX2)顺流水线发出读操作。
读操作的返回请求,顺流水线,优选顺优先级较低的总线(例如K总线),到达第一执行级(EX2)后,生成标志位清除使能。在本发明中,定义第一总线(J总线)的优先级高于第二总线(K总线)的优先级。
流水线第二执行级(EX3级)根据标志位清除使能,清除对应第一总线(J总线)和第二总线(K总线)中优先级较高的一者对应的状态标志位,即先清除第一状态标志位flag_j,将flag_j复位为0。
流水线第二执行级(EX3级)继续根据标志位清除使能,清除对应第一总线(J总线)和第二总线(K总线)中优先级较低的一者对应的状态标志位,即再清除第二状态标志位flag_k,将flag_k复位为0。
对应的,如果第一访问请求配置为执行写操作,流水线第一执行级(EX2)顺流水线发出写操作。
由于写操作无返回数据,流水线第一执行级(EX2)自动生成标志位清除使能。
流水线第二执行级(EX3级)根据标志位清除使能,清除对应第一总线(J总线)和第二总线(K总线)中优先级较高的一者对应的状态标志位,即先清除第一状态标志位flag_j,将flag_j复位为0。
流水线第二执行级(EX3级)继续根据标志位清除使能,清除对应第一总线(J总线)和第二总线(K总线)中优先级较低的一者对应的状态标志位,即再清除第二状态标志位flag_k,将flag_k复位为0。
步骤S18,进一步判断第一状态标志位flag_j和第二状态标志位flag_k是否均处于复位状态,即将flag_j和flag_k进行逻辑或运算,逻辑或运算结果为0则认为第一状态标志位flag_j和第二状态标志位flag_k均处于复位状态。在流水线停顿时,已经先行判断出引起第一状态标志位flag_j和第二状态标志位flag_k置位的第一访问请求和第二访问请求存在寄存器访问冲突,所以,此种情况下,需要按照引发冲突的访问顺序依次对寄存器完成访问后才可以回复流水线的正常次序。
步骤S19,如果第一状态标志位flag_j和第二状态标志位flag_k均处于复位状态,说明第一访问请求对应的读操作或者写操作已完成,寄存器可访问。执行第二访问请求对应的读寄存器操作或写寄存器操作,复位停顿状态标志位stall,即由1复位为0,流水线恢复,可继续从J总线或者K总线取指。
在一种优选的实施方式中,处理方法还包括以下步骤,
第一总线(J总线)传送的第一访问请求和第一目标寄存器ID顺流水线送至流水线第一执行级(EX2级);
第二总线(K总线)传动的第二访问请求和第二目标寄存器ID顺流水线送至流水线第一执行级(EX2级);
在流水线第一执行级(EX2级)判定是否符合取消第一访问请求或第二访问请求的设定条件,如果符合取消第一访问请求或第二访问请求的条件,则流水线第一执行级(EX2级)即取消第一访问请求或第二访问请求。此种情况下即不会出现访问冲突。例如采用伪指令if cond,j/K访问,如果cond为假则在EX2级取消J/K总线的访问请求。
如果不符合取消第一访问请求或第二访问请求的条件,则流水线第一执行级(EX2级)允许执行第一访问请求或第二访问请求,并进一步读取第一状态标志位flag_j或第二状态标志位flag_k。
本发明所提供的DSP寄存器访问冲突处理方法,在寄存器访问冲突时,置位停顿状态标志位stall迫使流水线取指,译码、预测等阶段的停顿。由于流水线停顿,因此没有新的指令进入流水线,进而保证不会连续产生访问冲突。同时,DSP处理器内部按照引发冲突的访问顺序依次对寄存器完成访问。其后复位stall信号,撤销停顿申请。流水线恢复后继续取指,这保证了指令的执行顺序与预期一致。
以上实施例仅用以说明本发明的技术方案,而非对其进行限制;尽管参照前述实施例对本发明进行了详细的说明,对于本领域的普通技术人员来说,依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或替换,并不使相应技术方案的本质脱离本发明所要求保护的技术方案的精神和范围。
Claims (6)
1.一种DSP寄存器访问冲突处理方法,其特征在于,包括以下步骤:
接收第一总线传送的第一访问请求,所述第一访问请求配置为执行对第一目标寄存器的读操作或写操作,记录第一目标寄存器ID;
接收第二总线传送的第二访问请求,所述第二访问请求配置为执行对第二目标寄存器的读操作或写操作,记录第二目标寄存器ID;
读取与第一访问请求对应的第一状态标志位以及与第二访问请求对应的第二状态标志位,并判断是否有至少一个处于置位状态;
如果所述第一状态标志位以及第二状态标志位有至少一个处于置位状态,则判断所述第一目标寄存器ID与第二目标寄存器ID是否相同;
如果第一目标寄存器ID与第二目标寄存器ID相同,则判定为发生寄存器访问冲突;
置位停顿状态标志位,配置流水线停顿取指、译码和预测,执行所述第一访问请求对应的读操作或写操作;
根据读操作或者写操作生成标志位清除使能并清除所述第一状态标志位和第二状态标志位;
判断第一状态标志位和第二状态标志位是否均处于复位状态;
如果第一状态标志位和第二状态标志位均处于复位状态,执行第二访问请求对应的读寄存器操作或写寄存器操作,复位停顿状态标志位,流水线恢复。
2.根据权利要求1所述的DSP寄存器访问冲突处理方法,其特征在于,所述处理方法还包括以下步骤:
所述第一总线传送的第一访问请求和第一目标寄存器ID顺流水线送至流水线第一执行级;
所述第二总线传送的第二访问请求和第二目标寄存器ID顺流水线送至流水线第一执行级;
流水线第一执行级判定是否符合取消所述第一访问请求或所述第二访问请求的设定条件;
如果符合取消所述第一访问请求或第二访问请求的条件,则流水线第一执行级取消所述第一访问请求或所述第二访问请求;
如果不符合取消所述第一访问请求或第二访问请求的条件,则流水线第一执行级允许执行所述第一访问请求或第二访问请求,读取所述第一状态标志位和所述第二状态标志位。
3.根据权利要求2所述的DSP寄存器访问冲突处理方法,其特征在于,置位停顿状态标志位,配置流水线停顿取指、译码和预测,执行所述第一访问请求对应的读操作或写操作后还包括:
如果所述第一访问请求配置为执行读操作,流水线第一执行级顺流水线发出读操作;
读操作的返回请求,顺流水线到达流水线第一执行级后,生成标志位清除使能;
流水线第二执行级清除对应所述第一总线和所述第二总线中优先级较高的一者对应的状态标志位;
流水线第二执行级清除对应所述第一总线和所述第二总线中优先级较低的一者对应的状态标志位。
4.根据权利要求2所述的DSP寄存器访问冲突处理方法,其特征在于,置位停顿状态标志位,配置流水线停顿取指、译码和预测,执行所述第一访问请求对应的读操作或者写操作后还包括:
如果所述第一访问请求配置为执行写操作,流水线第一执行级顺流水线发出写操作;
流水线第一执行级生成标志位清除使能;
流水线第二执行级清除对应所述第一总线和所述第二总线中优先级较高的一者对应的状态标志位;
流水线第二执行级清除对应所述第一总线和所述第二总线中优先级较低一者对应的状态标志位。
5.根据权利要求1至4任一项所述的DSP寄存器访问冲突处理方法,
所述第一访问请求和第二访问请求由同一指令行输出,第一访问请求触发第一状态标志位置位,所述第二访问请求触发第二状态标志位置位。
6.根据权利要求1至4任一项所述的DSP寄存器访问冲突处理方法,
所述第一访问请求和第二访问请求由两个指令行输出,第一访问请求触发第一状态标志位置位,所述第二访问请求触发第二状态标志位置位。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110654787.3A CN113488099A (zh) | 2021-06-11 | 2021-06-11 | Dsp寄存器访问冲突处理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110654787.3A CN113488099A (zh) | 2021-06-11 | 2021-06-11 | Dsp寄存器访问冲突处理方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113488099A true CN113488099A (zh) | 2021-10-08 |
Family
ID=77934855
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110654787.3A Pending CN113488099A (zh) | 2021-06-11 | 2021-06-11 | Dsp寄存器访问冲突处理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113488099A (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0992896A1 (en) * | 1998-10-06 | 2000-04-12 | Texas Instruments Inc. | Pipeline protection |
US6810475B1 (en) * | 1998-10-06 | 2004-10-26 | Texas Instruments Incorporated | Processor with pipeline conflict resolution using distributed arbitration and shadow registers |
CN102024490A (zh) * | 2009-09-23 | 2011-04-20 | 北京芯技佳易微电子科技有限公司 | 伪静态存储器及其读操作与刷新操作的控制方法 |
CN111857831A (zh) * | 2020-06-11 | 2020-10-30 | 海光信息技术有限公司 | 一种存储体冲突优化方法、并行处理器及电子设备 |
-
2021
- 2021-06-11 CN CN202110654787.3A patent/CN113488099A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0992896A1 (en) * | 1998-10-06 | 2000-04-12 | Texas Instruments Inc. | Pipeline protection |
US6810475B1 (en) * | 1998-10-06 | 2004-10-26 | Texas Instruments Incorporated | Processor with pipeline conflict resolution using distributed arbitration and shadow registers |
CN102024490A (zh) * | 2009-09-23 | 2011-04-20 | 北京芯技佳易微电子科技有限公司 | 伪静态存储器及其读操作与刷新操作的控制方法 |
CN111857831A (zh) * | 2020-06-11 | 2020-10-30 | 海光信息技术有限公司 | 一种存储体冲突优化方法、并行处理器及电子设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20070050563A1 (en) | Synchronization arbiter for proactive synchronization within a multiprocessor computer system | |
JP7118984B2 (ja) | ロード命令のメモリ・アクセスを回避するためのコンピュータ実装方法、システム、およびコンピュータ・プログラム | |
US20050198480A1 (en) | Apparatus and method of controlling instruction fetch | |
US9280349B2 (en) | Decode time instruction optimization for load reserve and store conditional sequences | |
KR20040045035A (ko) | 힌트 버퍼를 이용한 메모리 액세스 대기시간 숨김 | |
US11119930B2 (en) | Arithmetic processing apparatus and control method for arithmetic processing apparatus | |
JP3659877B2 (ja) | ライトアフターライトデータハザードにより生じるエラーを効率的に防止するためのスーパースケーラ処理システム及び方法 | |
CN110825437B (zh) | 用于处理数据的方法和装置 | |
US10853072B2 (en) | Arithmetic processing apparatus and method of controlling arithmetic processing apparatus | |
US7051191B2 (en) | Resource management using multiply pendent registers | |
US7376820B2 (en) | Information processing unit, and exception processing method for specific application-purpose operation instruction | |
US20040193849A1 (en) | Predicated load miss handling | |
US20040064684A1 (en) | System and method for selectively updating pointers used in conditionally executed load/store with update instructions | |
US7177982B2 (en) | Method to maintain order between multiple queues with different ordering requirements in a high frequency system | |
US20040117606A1 (en) | Method and apparatus for dynamically conditioning statically produced load speculation and prefetches using runtime information | |
US9817763B2 (en) | Method of establishing pre-fetch control information from an executable code and an associated NVM controller, a device, a processor system and computer program products | |
US6754813B1 (en) | Apparatus and method of processing information for suppression of branch prediction | |
CN111221573B (zh) | 一种寄存器访问时序的管理方法、处理器、电子设备及计算机可读存储介质 | |
CN113488099A (zh) | Dsp寄存器访问冲突处理方法 | |
JP2008090542A (ja) | エラー処理方法及び情報処理装置 | |
US7600102B2 (en) | Condition bits for controlling branch processing | |
JP2019212152A (ja) | 演算処理装置及び演算処理装置の制御方法 | |
US20090031118A1 (en) | Apparatus and method for controlling order of instruction | |
KR101947737B1 (ko) | 명시적 및 암시적 정보 흐름 추적 방법 및 그 장치 | |
US20080016292A1 (en) | Access controller and access control method |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |