SRAM/SPI项目及总线协议相关问题(三)
文章目录
- 1.你参加过哪些项目?
- 2.如何开始验证工作?验证流程
- 3.什么是regression,有什么用?
- 4.描述一下你的芯片项目?
- 5.你验证的目录结构是怎样的?这个结构的优缺点是什么的?
- 6.如何实现片选验证?(haddr[15],SRAM_CSN)回答通过bank_csn片选信号,面试官认为这不是真正的片选,问具体实现方式是不是通过时钟控制实现低功耗,低功耗的设计是不是通过三态门,和时钟有什么关系?
- 7.SRAMC怎么实现低功耗的?怎么去验证低功耗?
- 8. AHB在对sram进行pipeline操作,写完下一拍读,也就是地址2和数据1在同一拍的情况,hready是不是在写完后拉低一下(半拍),然后再立马拉高读出来呢?具体问题是读写操作连续hready需不需要拉低?
- 9.系统级sramc验证怎么验?
- 10.对sram进行读写,时延是怎么测试的?(多长时间写进去,多长时间读出来)
- 11.多个master驱动sram的情况如何验证?master是自己做的,还是买的?sram的带宽是多少?
- 12.AHB_sramc的early write是怎么验证的?
- 13.项目中AHB协议是用的全协议吗?hburst、hresp是情况验全了吗?
- 14.如果sram写数据晚了几个时钟,读写的时候会不会出现时序违例的情况,怎么检查的?
- 15.SRAM的地址应该怎么验证才能保证没有问题?
- 16. toggle覆盖率怎么收集的?大型系统中的单bit的信号多达上万个,所有的信号都需要收集tgl覆盖率吗?是否影响覆盖效率,如何做?
- 17.后门操作是有前提条件的,那regmodel该怎么设置?设置哪一项?前提条件是什么?
- 18.这个项目中验证的难点和重点是什么?如何解决的?
- 19.请举例说明你定位的一个逻辑Bug?
- 20.为什么接口例化要用到virtual?
- 21.如何理解代码覆盖率和功能覆盖率?
- 22.你如何判断自己负责的模块或项目验证完成?
- 23.你如何验证你提到的xxx功能/总线时序?
- 24.请举例说明你在工作中用到哪些脚本语言?
- 25.基于你的验证环境,解释一下SV/UVM中的xxx语法的意义?
- 26、面试官问APB_SPI项目建了哪些测试用例,约束怎么写的,怎么回答?参考代码都是一些基本用例,如果回答没有加约束没有随机会显得很low。
- 27、scb怎么对比数据,详细描述比较过程。
- 28、验证功能点怎么划分、哪些做了随机化?
- 29、uvm平台是怎样启动的(显示启动还是隐示启动)
- 30、仿真过程中遇到问题,如何定位 ?
- 31、参考模型如何调用,对比数据
- 32、在同一个testcase里面需要启动多个sequence(有数据的),应该怎样做?
- 33、regression具体怎么跑?怎么查看结果?怎么分析?
- 34、在跑回归时,怎么查看哪些用例pass/哪些用例fail?
- 35、APB_SPI项目每次回归要跑多久?
- 36、谈谈你对APB总线的理解?
- 37、谈谈你对SPI总线的理解?
- 38、抛开细节的信号类的不同,AHB和APB总线协议的本质不同是什么?
- 39. AHB总线上Slave设备的hready信号
- 40.AHB总线与AHB-Lite总线的区别?
- 41.APB-SPI 核的主要功能、验证平台?
- 42.SPI核的组成以及各个部分的功能?
- 43.最大可接多少设备?
- 44.SPI的时钟频率?协议,全双工?
- 45.如何实现低功耗?
- 46.主要有那些testcase?
- 47.功能覆盖点?
- 48.编写过程中,遇到了哪些问题?如何解决?
- 49.系统地址与物理地址之间的关系?为什么是4倍的关系?
- 50.你们项目中都会考虑哪些coverage?
- 51. coverage一般不会直接达到100%,当你发现有condition未cover到的时候你该怎么做?
- 52.为什么要尽量避免绝对路径的使用?如何避免?
1.你参加过哪些项目?
2.如何开始验证工作?验证流程
(1). 研究设计文档并进行分析与理解的同时,还需深入了解所需相关协议.
(2). 制定与完善验证计划包括明确目标、确定覆盖率要求、选择方法以及规划测试平台架构等.
(3). 搭建基于协议的测试平台并完成相应的编码工作.
(4). 根据测试计划创建完整的测试用例集合.
(5). 仿真及调试通常耗时较长;所使用的工具包括VCS/verdi等软件,并通过查看日志以及分析波形图来辅助排查问题.
(6). 回归回归测试以确保系统稳定性的同时,在现有基础上增补部分测试用例.
(7). 编写报告并提交代码审查文档的同时贴出覆盖率数据.
3.什么是regression,有什么用?
在回归测试中涉及的所有测试用例,在持续不断地进行仿真运行的基础上,在每天都能运行一次的情况下,其目的是两个方面:一是为了检测系统功能是否发生退化变化;二是为了及时发现潜在的问题。
- 在采用不同种子值的情况下运行一些随机测试案例可能会导致某些问题的发生, 回归测试作为一种手段可以在一定程度上识别出潜在的问题;
- RTL设计在经历版本更新的过程中可能会引发一系列潜在的问题, 回归测试则可以在一定程度上发现这些问题;
4.描述一下你的芯片项目?
- 芯片的核心作用在于其功能概述:
- 该芯片的空间布局结构采用了模块化设计:
- 该电路的时间线分析展示了其数据流程过程:
AHB_SRAMC:
主要功能
芯片结构 :

数据流:CPU读写SRAM
APB_SPI:
主要功能 :①该系统实现了全双工同步的数据传输过程;
②其最大承载能力为128位的信息量;
③可以选择发送最高有效位(MSB)或最低有效位(LSB);
④其接收和发送操作不受MOSI/MISO接口的影响;
⑤可以选择8个选型端口进行配置设置。
芯片结构 :

5.你验证的目录结构是怎样的?这个结构的优缺点是什么的?
- 能够呈现出来
- 优缺点:信息完备性方面具有较高的完整性;目录结构与验证架构高度契合度良好;这使得代码组件既系统完整又层次分明。
- 操作便捷性:不仅易于自动化处理;而且不容易出现错误。


如何通过haddr[15]和SRAM_CSN进行片选验证?回答中提到该方法通过bank_csn片选信号实现了验证过程。面试官对此提出了质疑,并询问具体实现方式是否依赖于时钟控制来实现低功耗设计。进一步讨论中提到低功耗设计是否采用三态门技术来实现,并探讨其与时钟的关系。
解析:在SRAM的RTL设计中采用了8块SRAM每块存储器具有8K容量其中用于选择各块存储器的功能被称为'片选'其中bank0_csn和bank1_csn信号用于控制各组的选择而该存储器内部使用的'片选'信号则由sram_csn完成

ahb_slave_if.v 文件中包含了bank的选择的SRAM片选的实现逻辑 。
bank_csn选择实现的RTL代码:
assign bank_csn_en = (sram_write || sram_read);//访问SRAM的总开关,读/写使能时,片选使能为1.
assign bank0_csn = (sram_csn_en && (sram_addr[15] == 1'b0))?sram_csn:4'b1111; //系统地址的最高位为sram_addr[15],
assign bank1_csn = (sram_csn_en && (sram_addr[15] == 1'b1))?sram_csn:4'b1111; //用来判断访问sram的bank0还是bank1,
代码解读
SRAM的实现的片选依靠sram_csn信号,代码如下:
// Generate the sram chip selecting signals in one bank.
// results show the AHB bus write or read how many data once a time:byte(8),halfword(16) or word(32).
always@(hsize_sel or haddr_sel)
begin
if(hsize_sel == 2'b10) //32bits:word operation,4片sram都会进行访问
sram_csn = 4‘b0; //active low,sram_csn信号低有效,4‘b0000代表4片SRAM都被选中
else if(hsize_sel == 2'b01) //16bits:halfword,选中4片中的其中两片(前两片或者后两片)
begin
if(haddr_sel[1] == 1'b0) //low halfword,若地址的低两位为00,则访问低16位;如为10,则访问高16位
sram_csn = 4'b1100; //访问低两片SRAM(低16bit)
else //high halfword
sram_csn = 4'b0011; //访问高两片SRAM(高16bit)
end
else if(hsize_sel == 2'b00) //8bits:byte,访问4片sram中的一片
begin
case(haddr_sel)
2'b00:sram_csn = 4'b1110; //访问最右侧的sram
2'b01:sram_csn = 4'b1101; //访问最右侧左边第一片sram
2'b10:sram_csn = 4'b1011; //访问最左侧右边第一片sram
2'b11:sram_csn = 4'b0111; //访问最左侧的sram
default::sram_csn = 4'b1111; //不会出现这种情况,haddr_sel只有上述所列00、01、10、11四种情况
endcase
end
else
sram_csn = 4'b1111; //不会出现这种情况,四片sram都不会被选中,hready常高,连续流水进行读写操作
end
代码解读
该低功耗设计与锁存器门控无直接关联,并受sram选中与否的影响。参考相关资料后得知,在sram处于未被选择的状态下其工作状态下的静态漏电流仅是全态工作状态下的十分之一左右。为了优化整体能耗,在具体设计中采用了8K×8位的大规模动态随机存取存储器,并支持8/16/32位等多种数据宽度。
低功耗的设计不涉及三态门。SRAM控制器本身也不包含三态门。遇到不清楚的问题时,请不要在面试中提及。如被询问,请表示不知道。
7.SRAMC怎么实现低功耗的?怎么去验证低功耗?
SRAM控制器的低功耗设计与时钟门控没有关系,与sram的片选有关,通过阅读sram的数据手册,可以发现当sram未选中时的功耗只有选中的sram的功耗的千分之一左右,因此设计8K*8 的多片SRAM,而且支持8/16/32位数据操作,这么操作的目的也是为了实现低功耗。
功耗验证需要看到具体的功耗数据,需要后端跑出物理信息数据,一般要通过PTPX软件来进行仿真。在SRAMC中,要想对功耗进行验证,可以自己建立一个SRAM的功耗模型,比如每一个8K*8的SRAM对应一个计数器,对应的每一个SRAM被访问时,通过采样对应的片选有效,对应的计数器加1,最终通过计数器值来代表功耗 。
AHB在对SRAM执行pipeline操作时,在完成下一拍的写操作后立即进行读取。具体来说,在同一拍内同时处理地址2和数据1的情况下(即地址2和数据1在同一拍被处理),HREADY是否会在完成写操作后短暂(半拍)保持低电平状态,并在随后立即拉高以获取数据?具体的问题在于连续进行读写操作时,HREADY是否需要保持低电平以确保正确数据传输?
该控制器具备单周期读写的特性,在设计架构中,所有hready_out信号均被预先置位为逻辑高电平以避免被拉低的现象,并且允许连续进行先写后读的操作。建议读者自行编写测试用例来验证该功能。
9.系统级sramc验证怎么验?
系统级验证工作主要通过由CPU执行驱动软件来完成对总线中各IP间数据传输行为的测试工作。在SRAM控制器的系统级测试阶段中,则需要重点关注芯片在典型应用场景下的运行表现:例如,在芯片实际运行过程中, CPU会对SRAM存储空间执行读写操作遍历;例如在通用DMA模式下完成内存到内存的数据传输任务;例如针对SD host端口实现的数据读写操作也需要得到充分支持;除了常规的应用测试方案外, 还需结合系统的压力测试需求, 对整体地址空间范围内的数据传输行为进行全面分析。
10.对sram进行读写,时延是怎么测试的?(多长时间写进去,多长时间读出来)
此处所指的是单周期读写还是多周期读寫,并非指Setup and Hold Time(這裡保留英語原文)。funcional仿真通常没有延迟,在後面仿真時進行延遲測試,则通常在後面仿真時進行
11. 如何验证多个 master 驱动的 SRAM 的配置情况?请问 master 是自行设计还是采购?请告知该 SRAM 的带宽参数是多少?
AHB协议是一种排他性协议,在这种协议下,在同一时间段内只有一个Master占用总线资源以避免多个Master同时占用同一根总线而导致的操作冲突 。如果采用矩阵式互联结构(AHB Bus matrix),则能够实现并行的操作模式后允许多个Master同时访问SRAM资源的情况。**在AHB总线上工作的Master分为两类:一种是购买的第三方IP芯片(如ARM公司的Cortex M系列微控制器或Synopsis公司的DMA控制器);另一种是自行设计开发的产品(如SD Host系列控制器)。通过以下计算公式(100MHz \times 32bit / (8Byte \times 2) = 200MB/s)可以计算出数据传输带宽的能力值:总线宽度乘以总线工作频率再除以每个时钟周期传输的数据包个数。
12.AHB_sramc的early write是怎么验证的?
假如对面试官的问题不明确,
建议首先询问面试官关于early write的解释,
然后评估如何应对。
我们的SRAM控制器是基于单周期读写的,
没有采用early write机制。
13.项目中AHB协议是用的全协议吗?hburst、hresp是情况验全了吗?
本项目采用AHB-Lite协议,并未包含split、retry、error及wait(将hready_out保持低电平)等功能特性。SRAM则具备单周期读写能力,在RTL设计中未使用hburst信号时,默认将其置高电平,并始终保持hresp处于OK状态。在验证环节,则将所有相关参数设置为单一状态:即置hburst为低电平,并维持此状态无需额外关注原因。这是因为AHB协议规定中Master的burst传输并非真正意义上的burst传输模式——实际上Master依然会依照每个地址单独发送数据包进行操作。
当sram延迟了若干个时钟周期进行数据写入操作时,读取和写入操作是否会导致时序违规?如何排查并验证?
通常由 backend 人员完成这项工作。在前仿阶段无需关注 timing violations 的问题,在后仿阶段使用形式验证工具 Formality 进行检查。
15.SRAM的地址应该怎么验证才能保证没有问题?
为了优化SRAM项目的性能效率,在实现硬件架构时需特别注意其存储空间的设计方案
第十六题是如何获取toggle覆盖率的?在一个大型系统中,每个bit位都会发送大约十个以上的信号,这些信号都必须具备toggle覆盖率吗?这样的做法会不会降低覆盖效率呢?具体该采取哪些措施?
toggle代码覆盖率——单bit信号的翻转覆盖率,包含从0到1、从1到0的翻转情况,toggle的覆盖率一般比较难以达到100%,特别是内部的逻辑信号。但是对接口的信号,其toggle覆盖率要达到100%,而内部的toggle信号需要进行人工评审,与设计工程师进行讨论,没有覆盖的toggle信号是不是可以exclude掉。
RTL的代码覆盖率一般通过仿真工具进行自动收集,如VCS、Questasim、IES等,并且可以生成方便阅读的报告文件,验证工程师可以通过查看覆盖率报告,进行分析。另外,很多公司对coverage的要求中,没有对toggle覆盖率做硬性要求,所以抓住主要信号是关键。
17. 后门操作的实施必须基于特定的前提条件,请问在使用regmodel时应该如何进行参数配置?具体应选择哪一个参数?这些前提条件包括哪些内容?

18.这个项目中验证的难点和重点是什么?如何解决的?
- 随机化
- 覆盖率
- RAL模型
19.请举例说明你定位的一个逻辑Bug?
- 通过专业技能,发现了问题,而非运气
- 态度,记录下了发现的问题
20.为什么接口例化要用到virtual?
在class中无法创建或实例化物理接口。物理接口 interface代表了真实的信号,在测试平台通过端口将这些界面进行静态连接操作时会将它们结合起来工作。
对于大规模的设计而言,在测试平台实现与设计的动态连接是必要的需求之一
21.如何理解代码覆盖率和功能覆盖率?
- 了解代码覆盖性和功能覆盖性的作用。
- 当出现较低水平的代码覆盖度但较高的功能性覆盖度时可能暗示着需要增补功能性覆盖度。
- 当处于较低水平的函数执行能力却拥有较高的测试用例数量时可能暗示着存在测试用例冗余的问题。
- 在测试初期阶段可能出现较低水平的同时具备一定的测试用例数量这可能提示着系统尚未完成基本的设计工作。
- 较高的测试用例执行能力配合较低的数量这可能提示着系统中存在冗余或者重复的功能实现。
- 较高的测试用例执行能力配合较低的数量这可能提示着系统中存在冗余或者重复的功能实现。
覆盖程度指的是我们的代码在测试过程中能被覆盖的比例 。因此,在理论上而言越高越好。这意味着我们的每一行代码都经过了测试并得出了预期的答案。然而我们不应该过分关注于其覆盖程度的具体数值或比例
并不是说越高的代码覆盖程度就能代表代码质量越好以及BUG数量越少。实际上即使覆盖程度再高也不一定能保证程序质量与错误数量最少。仅仅通过高覆盖程度并不能充分证明程序的质量如何而且可能存在许多未被发现的问题。尽管如此高的覆盖度也未必是高质量的代码但是当覆盖度较低时可能会导致严重的问题
- 项目处于初期阶段(代码覆盖率为较低水平), 其后续工作包括在开发过程中持续使用不同的随机种子, 直至达到稳定状态. 在此基础上, 我们会为每个新增的功能模块创建额外的约束条件, 并生成相应的测试用例. 最后, 我们会收集那些能够有效提升系统稳定性的关键组件.
- 当前情况表明(系统具备较高的功能性), 这种现象可能源于两个原因: 首先, 验证方案未能完全涵盖所有的开发模块; 其次, 测试方案未能完全匹配所有的开发模块. 在这种情况下, 我们建议立即回溯硬件的设计文档, 更新并优化验证方案.
- 验证平台已成功运行了全部的开发流程(系统具备较高的功能性), 然而我们并未对某些特定的状态进行定位. 这里有两个可能性: 第一, 我们的关注点仅限于部分感兴趣的状态; 第二, 系统具备较高的功能性但并未被检测到. 如果是前者情况, 可以尝试通过形式化方法提取系统的运行状态信息; 如果是后者情况,则需要补充针对未被实现的功能点.
22.你如何判断自己负责的模块或项目验证完成?
- 每个功能点都已通过测试。
- 全部用例均以通过状态存在。
- 覆盖率收集指标满足标准:code+function coverage.
23.你如何验证你提到的xxx功能/总线时序?
- 时序验证:断言SVA property
例如:APB_SPI中的pready信号的时序验证:
property pready_check;
@(posedge PCLK) disable iff(PRESETn == 0)
PREADY |-> (PSEL == 1)&&(PENABLE == 1);
endproperty
CHK_PREADY: assert property(pready_check);
代码解读
24.请举例说明你在工作中用到哪些脚本语言?
- shell脚本
- 会编写基础的Makefile脚本
- 不同编程语言分别适用于不同场景
- 其中有些则专用于文本处理任务;另一些则擅长仿真系统管理;还有一些则用于控制仿真器的接口。

25.基于你的验证环境,解释一下SV/UVM中的xxx语法的意义?
- task与function的使用
- fork…join
- uvm_config_db
在 UVM 中将 task 和 function 分别对应于不同类型的 phase。对于低负载的 phase 通常被定义为 function 类型(即函数级),而高负载的任务则被单独划分为 task 类型(即任务级)。UVM 中的 phase 通常分为 function phase 和 task phase 两大类。
UVM内置了一个数据库表(database table),类似于一个全局资源库,能够获取任何类型的数据。组件能够随时从数据库中获取数据。配置数据库(configuration database)为访问内置数据库提供了途径。通过uvm_config_db::set和uvm_config_db::get方法,在配置 databases 中分别进行数据获取。从而实现变量或接口的跨层次传输。
面试官询问APB_SPI项目构建了哪些测试用例及其约束条件的编写方法,请详细说明如何回答?根据参考代码提供的基础测试案例,在作答时若未附加必要的约束条件可能会导致答案显得不够专业
解析1:项目要求自行完成相关工作内容,在缺乏主动参与的情况下此类技术难题就无法深入探讨细节也就无法准确解答!在APB_SPI项目的数据库中已预先配置了一部分测试案例还需自行分析现有测试案例同时应主动探索并补充新的测试场景以确保全面覆盖各种使用场景
27、scb怎么对比数据,详细描述比较过程。
28、验证功能点怎么划分、哪些做了随机化?
回答:时钟复位,中断,寄存器,基本功能等
面试官要求做更详细的介绍,怎么去回答;
解析:面试过程中,都会涉及的项目的细节,这些细节,需要自己动脑思考,动手编写代码,进行编译和仿真。不能只靠死记硬背老师告诉大家的内容,不然是没办法通过技术面试的。
功能点的划分的基本原则:复位的处理、时钟的处理、寄存器的测试、中断的测试、数据的读写功能 。
具体到不同的项目,就需要具体的分析,上升沿发数据和下降沿发数据等各种小的功能点。这些内容都可以通过课程中讲到的文档获取这些信息。
- 时钟信号恢复性测试涵盖了主振荡器频率及时序分析;该过程包括上电后硬态复位过程(即上电后硬态复位操作)、配置系统内部寄存器进行软态复位操作以及在有效运行时段内完成必要的复制度衡。
- 存储单元处于预定置位状态下的数据存储与读取特性分析包括对存储容量、访问速度以及数据完整性等关键参数的研究与评估。
- 系统功能模块的基本运行能力包括正常的数据输入输出操作能力;各存储块的工作边界线及其对应的异常情况下的性能评估方法;此外还包括对系统整体功能性进行全面而细致的功能验证。
- 性能指标检测方法包含采用单周期读取模式来衡量存储芯片的整体性能水平;这种检测手段能够全面反映存储芯片在不同工作状态下的性能表现。
apb_seq中配置了随机化变量addr、data、we信号,并由adapter负责将RAL寄存器级的数据转化为事务级激励并传递给apb_seq以实现对DUT寄存器的随机化驱动。
spi_seq中则设定变量spi_data、no_bits、RX_NEG并通过随机化流程直接传输至DUT完成对其的随机化测试。
29、uvm平台是怎样启动的(显示启动还是隐示启动)
UVM的运行基于一种称为phase的机制。通常情况下,在sequence内部设置的所有starting_phase都会被自动开启。只有当在代码中直接调用start函数时才会主动启动相关功能。
30、仿真过程中遇到问题,如何定位 ?
这个问题既涉及工程实践又体现工程思维,在很多情况下并没有绝对正确的答案。
在基于UVM的自动比较平台上定位问题时,
可以通过分析大量日志文件(log)来辅助定位。
这时就需要在testbench中添加大量(trace)信息(如uvm_info、uvm_error和uvm_fatal等),以全面了解平台运行状态以及数据期望值与实际值之间的差异。
如果仅凭日志文件无法准确定位到问题根源时,
则需要进一步借助波形文件(dump waveform),通过追踪特定信号的行为来深入分析其本质。
当验证工程师在仿真过程中发现问题时,
首先需要排查testbench和testcase是否存在潜在问题。
这些属于验证工程师自身的工作范畴,
与RTL设计并无直接关联,
因为当前使用的testbench复杂程度通常高于RTL设计,
而testcase编写不规范或流程顺序不当(如SD初始化阶段的操作流程)都可能造成错误。
在此基础上,
如果排除了testbench和testcase的问题后仍有疑虑,
则需要考虑是否存在RTL设计上的缺陷。
此时也需要借助波形分析工具来进行定位工作,
并且要求对RTL代码有一定了解才能完成相关诊断工作。
31、参考模型如何调用,对比数据
32、在同一个testcase里面需要启动多个sequence(有数据的),应该怎样做?
一个sequence不仅具有嵌套结构,并且每个sequence都可以包含多个其他不同类型的sequences。每个sequence都具备显式启动的能力,并能够按照预定顺序执行start函数以完成初始化操作。为了实现不同driver同时启动各自所需的sequence,在多driver环境下需要引入virtual sequence机制来保证各序列间的同步运行。
33、regression具体怎么跑?怎么查看结果?怎么分析?
回归分析可以通过编写 Perl 脚本实现其自动化计算功能。通过 Makefile 来执行相关操作流程,并解析生成的 log 文件内容以获取程序运行结果的相关指标数据。在实验过程中需要持续监控系统运行状态参数的变化情况,并在观察到异常现象时及时触发警报机制以确保数据采集过程的稳定性与可靠性。
34、在跑回归时,怎么查看哪些用例pass/哪些用例fail?
解析:在每个testcase中配置成功与失败(成功与失败):当scoreboard对比正确时输出'pass'关键字;如果有错误则记录'failed'关键字到日志文件中;通过perl脚本处理所有的仿真文件来确定哪些testcase出现故障或完成。
35、APB_SPI项目每次回归要跑多久?
解析:API_SPI设计代码在2000多行,目前跑20多个testcase,不超过1小时。
regr:
make all TEST=spi_test_base
make all TEST=spi_poll_test
make all TEST=spi_interrupt_test
make all TEST=spi_reg_test
make all TEST=spi_reg_test1
make all TEST=spi_reg_test2
代码解读
36、谈谈你对APB总线的理解?
APB总线是一种低功耗、低速总线接口,在硬件设计中主要用于实现外设之间的高效通信。它能够挂载各种外接设备如SPI、I2C、UART、GPIO等类型的功能模块;其工作状态主要由一系列控制信号来定义包括但不限于PCLK(主时钟)、PRESETn(复位)、PSEL(选择)、PENABLE(启用)、PWRITE(写入)、PADDR(地址)、PWDATA(数据)、PRDATA(反馈)以及PREADY(完成)等关键字段。在数据传输过程中采用分时策略实现高效管理:当发生读操作时系统将切换至读准备阶段;而一旦转入写操作则会立即切换至持续输出模式;这种多态的工作模式能够有效提升资源利用率并保证通信系统的稳定性运行
在数据传输过程中系统按照设定的工作流程进行操作:首先进入Setup阶段时PSEL置1而PENABLE置0此时总线处于等待新数据的状态;随后触发读操作后进入Enable阶段在此状态下不仅接收器端准备好接收相应的数据而且发送方也会同步完成相关操作;在整个过程中所有的控制信号均保持稳定状态直到下一个周期重新开始这一机制不仅能够有效提高通信效率还能够确保系统的可靠性运行;特别需要注意的是当存在多个设备同时访问同一个总线时必须按照优先级顺序依次完成操作否则可能会导致冲突进而影响整体通信效果
37、谈谈你对SPI总线的理解?
SPI总线是一种高速的 通信总线,可以用来实现MCU与各种外接设备连接(芯片与芯片之间的连接),实现对外围芯片的配置。而且一个SPI Master可以通过共享数据线的方式可以连接多个SPI Slave(一主多从) 。SPI总线的信号包括有SCLK、MISO、MOSI、SS_n 。
在SPI总线上数据的传输具有全双工,同步,串行,主从结构 的数据传输特点。时钟信号(Clock Signal)只能由SPI Master设备产生,时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样 , 来保证数据在两个设备之间是同步传输的。而且一个SPI Master可以通过共享数据线的方式可以连接多个SPI Slave(一主多从) 。SPI 设备间的数据传输之所以又被称为数据交换(全双工通信), 是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 “发送者(Transmitter)” 或者 “接收者(Receiver)”. 在每个 Clock 周期内, SPI 设备都会发送并接收一个 bit 大小的数据(串行通信)(不管主设备好还是从设备),相当于该设备有一个 bit 大小的数据被交换了。
38、抛开细节的信号类的不同,AHB和APB总线协议的本质不同是什么?
AHB能够支持地址与数据的流水传输,并且具有较高的性能水平;同时支持主从模式下的通信连接(master/slave)。apb单个命令至少需要两个时钟周期才能完成,并且无法实现流水传输;其运行效率较低,并连接一些低速外围设备
APB相比于AHB总线的特点是:挂接低速外设、设计简单、功耗低。
AHB与APB各有优势,二者在具体使用上可以相互补充;
39. AHB总线上Slave设备的hready信号
通常,在AHB总线上工作的从属设备都配备有两根hready信号。其中一根为输入类型(标记为hready_in),另一根为输出类型(标记为hready_out)。在 AHB总线协议框架下,默认情况下当Master设备发起读写操作时, master 设备无法及时响应时, slave 设备会通过将 hready_out 信号置低的方式延缓 data phase 周期。
在进行Pipeline操作时,在处理当前阶段(data phase)时需要注意的是:当前阶段(phase)会被下个阶段(next stage)所引用地址(address)。因此,在Master设备向所有Slave执行指令以处理其他任务时,在等待其完成之前,请确保首先确认 Master 设备是否已完成了上一个指令周期的所有 Slave 设备的任务。“ready_in”变量正是用来指示 Master 设备是否已完成对所有其他 Slave 设备的最新指令的标志位。
40.AHB总线与AHB-Lite总线的区别?
AHB 接口允许多个 Master 对 total 线上的 slave 设备进行访问操作。
而 AHB-Lite 接口则仅允许一个 Master 对 total 线上的 slave 设备执行访问操作。
在功能上相比 Ahb 总线少一些信号。
由于 Ahb-Lite 总线上只有一个 Master 节点。
因此,在 Ahb 上无需发送 HBUSREQ 和 HGRANT 等仲裁信号。
同样的情况也适用于 Ahb-Lite 总线上所有的 Slave 节点。
因为只有一个 Master 节点的存在。
所以在 AHB-Lite 接口中不会出现 retry 或 split 传输状态。
41.APB-SPI 核的主要功能、验证平台?
- 全双工同步串行通信采用双向同步串行技术完成数据传输任务;
- 系统兼容以太网总线协议接口并支持其功能模块连接;
- 通过寄存器配置实现单次传输信息量的可变性,并支持最大128bit的信息传输能力;
- 系统允许选择先发送最高有效位或最低有效位作为起始标志;
- 支持接收/发送数据在上升沿或下降沿切换,并确保MOSI与MISO信号不受影响;
- 提供8个来源设备的选择功能(通过8条控制信号实现);
- 设计基于一个时钟域运行(特别说明需要区分PCLK和SCK信号)。
42.SPI核的组成以及各个部分的功能?
1)、APB接口模块 :主要负责APB总线和SPI模块通信,需要对APB总线信号进行译码,使得APB 总线的读写命令能够正确被SPI模块接收并执行,APB接口模块存储着IP核寄存器的地址信息,控制着寄存器的读写。
2)、寄存器模块 :存放着IP核重要的配置信息。CPU可通过寄存器模块实现对IP核的功能配置和状态控制,使用IP核前必须先配置该模块。
3)、发送模块 :因为模块可配置成SPI主/从模式,所以,发送模块里面含有主机发送子模块和从机发送子模块。配置为主机时,主机发送模块负责把APB总线写入发送FIFO的数据读出,并且进行数据并转串操作,按照SPI数据传输时序发送给SPI从机 ,此时从机发送模块不工作。配置从机模式时,从机发送模块仍需要将写入发送FIFO的数据读出,并进行数据的并转串操作,然后,在主机发送的串行时钟触发下,按照SPI数据传输时序发送给SPI主机。
4)、接收模块 :因为模块可配置为SPI主/从模式,所以,接收模块既有主机接收子模块,也有从机接收子模块。配置为主机时,主机接收子模块将SPI从机发送过来的串行数据转换成并行数据,然后写入到接收FIFO中,以便CPU通过APB总线读出数据 。配置为从机时,从机接收子模块在主机发送的串行时钟的触发下,将发送过来的串行数据转换成并行数据,写入到接收FIFO中。
43.最大可接多少设备?
8个设备
44.SPI的时钟频率?协议,全双工?
SPI 协议未对频率作出具体规定。
通常在 400KHz 至 10MHz 之间。
本项目的 SPI 时钟频率可通过 DIVIDER 分频寄存器调节时钟频率。
45.如何实现低功耗?
本项目未对低功耗技术进行实现;然而,在模块的工作过程中可以通过降频操作来实现降频功能;这可能会相应地减少模块的数据传输速率。
46.主要有那些testcase?
寄存器的默认值检查——reg_dafault_value_check_test
寄存器的读写属性检查——reg_read_write_test
接收数据寄存器的接收数据传输检查——spi_rx_base_test
发送数据寄存器的发送数据传输检查——spi_tx_base_test
全双工同步传输检查——spi_rx_tx_base_test
spi数据传输长度检查(8/16/32/64/96/128bits)——spi_transfer_length_8/16/32/64/96/128
spi传输比特序检查(先发MBS/LSB)——spi_transfer_MSB/LSB_test
spi发送数据的边沿检查(上升/下降沿)——spi_tx_posedge/negedge_test
spi接收数据的边沿检查(上升/下降沿)——spi_rx_posedge/negedge_test
支持将系统时钟分频应用到spi时钟的检查——spi_divider_clk_test
中断使能检查——spi_transfer_ie_test
传输数据长度随机化检查 ——CHAR_LEN随机处理——spi_transfer_length_random
47.功能覆盖点?
covergroup reg_rw_cov;
option.per_instance = 1;
ADDR: coverpoint address{ //定义地址覆盖点
bins DATA0 = {0};
bins DATA1 = {4};
bins DATA2 = {8};
bins DATA3 = {5'hc};
bins CTRL = {5'h10};
bins DIVIDER = {5'h14};
bins SS = {5'h18}; //5’h18的十进制数为24, 5bit位宽最大可表示值为31>24
}
CMD: coverpoint wnr{ //定义读写使能覆盖点
bins WR = {1};
bins RD = {0};
}
RW_CROSS: cross CMD,ADDR; //定义交叉覆盖
endgroup
//将控制寄存器CTRL的各个域段和时钟控制寄存器DIVIDER设置为功能验证点,保证两个寄存器可以在运行中被访问到
covergroup combination_cov;
option.per_instance = 1;
ASS: coverpoint spi_rm.ctrl.ass.value[0]; //定义控制寄存器的各个域段的覆盖点
IE: coverpoint spi_rm.ctrl.ie.value[0];
LSB: coverpoint spi_rm.ctrl.lsb.value[0];
RX_NEG: coverpoint spi_rm.ctrl.rx_neg.value[0];
TX_NEG: coverpoint spi_rm.ctrl.tx_neg.value[0];
CHAR_LEN:coverppoint spi_rm.ctrl.char_len.value[6:0]{
bins LENGTH[] = {0,1,[31:33],[63:65],[95:97],126,127};
}
CLK_DIV:coverppoint spi_rm.divider.divider.value[7:0]{ //定义时钟寄存器域段的覆盖点
bins RATIO[] = {16'h0,16'h1,16'h2,16'h4,16'h8,16'h10,16'h20,16'h40,16'h80};
}
COMB_CROSS:cross ASS,IE,LSB,RX_NRG,TX_NEG,CHAR_LEN,CLK_DIV;
endgroup
代码解读
48.编写过程中,遇到了哪些问题?如何解决?
49.系统地址与物理地址之间的关系?为什么是4倍的关系?
- CPU编址(软件系统):以字节(Byte)为单位;
- 存储器编址(硬件物理地址):其实际宽度所对应的存储单元即为物理地址。
该存储器采用64K位型式,并实现实际存储容量为64K 8bit。其实际存储位宽扩展至32bit后,则同样可表示为16K 32bit。值得注意的是,在此配置下,地址字段按递增序列0、1、2、3等依次取值,并非按软件系统采用的0、4、8、C等间隔取值的方式。物理地址 = 逻辑地址 / 4
50.你们项目中都会考虑哪些coverage?
行覆盖度、条件覆盖度、分支覆盖度、切换点覆盖度以及(FSM)语句覆盖度
51. 通常不会完全覆盖所有情况的coverage,在遇到某些特定条件未被覆盖时,建议采取以下措施。
编写定向测试用例(direct case)
52.为什么要尽量避免绝对路径的使用?如何避免?
绝对路径的使用显著降低了验证平台的复用能力和跨平台兼容性。例如将clk层级从top.clk提升到top.top_inst.clk,则会使得相应组件中的信号需要进行大量修改。一种方法是采用宏定义与接口设计来实现同样的功能。
