现有测试用例的复用
当我们完成文档的编写,接下来就是对代码库进行分析,来确定哪一些可以进行复用。我们可以利用这段时间来评估一下有多少现有代码可以继续用于当前项目。另外如果时机允许也可以借此来评估对整个组织内的相关代码,通过整合资源可以更好的提升开发效率。
约束
PSS描述文件绝大部分基于约束语句,这是由其声明特性所决定的。所以现有的一些约束文件也可以很轻易的转换成PSS格式进一步节省开发时间。
SystemVerilog的约束文件由于其声明特性,通常可以作为PSS描述文件二次再开发的来源。另外其本身语法特性与PSS非常相似,我们甚至可以直接拷贝复制进PSS文件直接进行使用。这种情况的使用案例是一些IP或者子系统的配置对象代码,可以这样复用在PSS文件当中。
通常约束文件可读性比较低,比如SoC的内存映射文件。但是通过一点点改动,我们就能将其改写成PSS约束,来专门定义不同内存空间的读取权限。
测试案例实现细节
团队现存的测试环境通常是一个非常好的实现基础,当然这其中需要花时间将其按照PSS的语法进行改动。
UVM环境中,我们会使用utility sequence来对IP模块进行简单的操作,比如初始化设置,命令其进行数据计算等等。这些序列在定义时通常有一些随机约束和变量。其他情况下,我们会通过输入参数来控制其工作模式。无论如何,我们都可以通过一些方法将其转换成PSS描述文件。
task init_single_transfer( int unsigned channel, int unsigned src, int unsigned inc_src, int unsigned dst, int unsigned inc_dst, int unsigned sz); wb_dma_ch ch = m_regs.ch[channel]; uvm_status_e status; uvm_reg_data_t value; // Disable the channel ch.CSR.read(status, value); value[0] = 0; ch.CSR.write(status, value); // These registers are volatile. Read-back the content // so the register model knows to re-write them ch.A0.read(status, value); ch.A1.read(status, value);
图六 – SystemVerilog测试复用实例
图六截取了一段SystemVerilog代码,其中我们定义了一个virtual sequence的task,来设计DMA引擎在一条特定的数据通路上传输数据。这段代码就可以通过简单改写将其使用在测试DMA引擎的PSS模型中。需要注意的是,因为我们本身的代码使用了UVM,所以底层是使用了UVM寄存器模型来读取DMA引擎的相关寄存器。
void wb_dma_drv_init_single_xfer( wb_dma_drv_t *drv, uint32_t ch, uint32_t src, uint32_t inc_src, uint32_t dst, uint32_t inc_dst, uint32_t sz ) { uint32_t sz_v, csr; csr = WB_DMA_READ_CH_CSR(drv, ch); csr |= (1 << 18); // interrupt on done csr |= (1 << 17); // interrupt on error if (inc_src) { csr |= (1 << 4); // increment source } else { csr &= ~(1 << 4); } if (inc_dst) { csr |= (1 << 3); // increment destination } else { csr &= ~(1 << 3); // increment destination } csr |= (1 << 2); // use interface 0 for source csr |= (1 << 1); // use interface 1 for destination csr |= (1 << 0); // enable channel // Setup source and destination addresses WB_DMA_WRITE_CH_A0(drv, ch, src); WB_DMA_WRITE_CH_A1(drv, ch, dst); sz_v = WB_DMA_READ_CH_SZ(drv, ch); sz_v &= ~(0xFFF); // Clear tot_sz sz_v |= (sz & 0xFFF); WB_DMA_WRITE_CH_SZ(drv, ch, sz_v); // Start the transfer WB_DMA_WRITE_CH_CSR(drv, ch, csr); drv->status[ch] = 1;}
图七 – 相关测试的C代码复用
上图是一个相似功能的C代码实现。我们同样也可以将其转换用在PSS测试中。
当然需要注意的是虽然两种代码实现的测试目的相似,但我们会讨论哪一种更适合用在PSS文件中。
现有测试用例的复用
当我们完成文档的编写,接下来就是对代码库进行分析,来确定哪一些可以进行复用。我们可以利用这段时间来评估一下有多少现有代码可以继续用于当前项目。另外如果时机允许也可以借此来评估对整个组织内的相关代码,通过整合资源可以更好的提升开发效率。
约束
PSS描述文件绝大部分基于约束语句,这是由其声明特性所决定的。所以现有的一些约束文件也可以很轻易的转换成PSS格式进一步节省开发时间。
SystemVerilog的约束文件由于其声明特性,通常可以作为PSS描述文件二次再开发的来源。另外其本身语法特性与PSS非常相似,我们甚至可以直接拷贝复制进PSS文件直接进行使用。这种情况的使用案例是一些IP或者子系统的配置对象代码,可以这样复用在PSS文件当中。
通常约束文件可读性比较低,比如SoC的内存映射文件。但是通过一点点改动,我们就能将其改写成PSS约束,来专门定义不同内存空间的读取权限。
测试案例实现细节
团队现存的测试环境通常是一个非常好的实现基础,当然这其中需要花时间将其按照PSS的语法进行改动。
UVM环境中,我们会使用utility sequence来对IP模块进行简单的操作,比如初始化设置,命令其进行数据计算等等。这些序列在定义时通常有一些随机约束和变量。其他情况下,我们会通过输入参数来控制其工作模式。无论如何,我们都可以通过一些方法将其转换成PSS描述文件。
task init_single_transfer( int unsigned channel, int unsigned src, int unsigned inc_src, int unsigned dst, int unsigned inc_dst, int unsigned sz); wb_dma_ch ch = m_regs.ch[channel]; uvm_status_e status; uvm_reg_data_t value; // Disable the channel ch.CSR.read(status, value); value[0] = 0; ch.CSR.write(status, value); // These registers are volatile. Read-back the content // so the register model knows to re-write them ch.A0.read(status, value); ch.A1.read(status, value);图六 – SystemVerilog测试复用实例
图六截取了一段SystemVerilog代码,其中我们定义了一个virtual sequence的task,来设计DMA引擎在一条特定的数据通路上传输数据。这段代码就可以通过简单改写将其使用在测试DMA引擎的PSS模型中。需要注意的是,因为我们本身的代码使用了UVM,所以底层是使用了UVM寄存器模型来读取DMA引擎的相关寄存器。
void wb_dma_drv_init_single_xfer( wb_dma_drv_t *drv, uint32_t ch, uint32_t src, uint32_t inc_src, uint32_t dst, uint32_t inc_dst, uint32_t sz ) { uint32_t sz_v, csr; csr = WB_DMA_READ_CH_CSR(drv, ch); csr |= (1 << 18); // interrupt on done csr |= (1 << 17); // interrupt on error if (inc_src) { csr |= (1 << 4); // increment source } else { csr &= ~(1 << 4); } if (inc_dst) { csr |= (1 << 3); // increment destination } else { csr &= ~(1 << 3); // increment destination } csr |= (1 << 2); // use interface 0 for source csr |= (1 << 1); // use interface 1 for destination csr |= (1 << 0); // enable channel // Setup source and destination addresses WB_DMA_WRITE_CH_A0(drv, ch, src); WB_DMA_WRITE_CH_A1(drv, ch, dst); sz_v = WB_DMA_READ_CH_SZ(drv, ch); sz_v &= ~(0xFFF); // Clear tot_sz sz_v |= (sz & 0xFFF); WB_DMA_WRITE_CH_SZ(drv, ch, sz_v); // Start the transfer WB_DMA_WRITE_CH_CSR(drv, ch, csr); drv->status[ch] = 1;}图七 – 相关测试的C代码复用
上图是一个相似功能的C代码实现。我们同样也可以将其转换用在PSS测试中。
当然需要注意的是虽然两种代码实现的测试目的相似,但我们会讨论哪一种更适合用在PSS文件中。
举报