网易首页 > 网易号 > 正文 申请入驻

一种解决SoC总线功能验证完备性的技术

0
分享至

1

前言

通过总线将各个IP通过总线连接起来的SoC芯片是未来的大趋势,也是缩短芯片开发周期,抢先进入市场的常用方法。如何确保各个IP是否正确连接到总线上,而且各IP的地址空间分配是否正确,是一件很棘手的事情。本文提出了一种新方法,可以解决SoC总线验证的诸多困难,既简单又快速地完成SoC总线功能验证。

2

SoC总线功能验证难点

在SoC芯片开发过程中,SoC总线功能验证是确保各IP能否顺畅互动的关键,可以把每个IP比较一座座房子,总线就是房子和房子之间的路,路没修好或者修错了,房子建得再稳固再漂亮都没有什么用。以往的SoC总线面临诸多困难,导致TB代码又长又难以继承复用。主要的困难点有:

  • 总线的地址空间(memory map)频繁改动,TB需要实时适配;

  • 需要定义和维护大量的宏;

  • 不方便遍历整个地址空间的全部各区间;

  • 区间和区间之间的从属关系在TB中很难反应出来;

  • 激励完备性难以保证,只能挑选一些典型的场景和区间去测试;

3

解决方案

本文提出的一种SoC总线功能验证方法完美解决了上述问题,非常使用,而且在真实项目中也实践过了。它有以下优点:

  • 减少TB代码修改;

  • 无需大量宏定义;

  • 方便使用;

  • 确保完备性;

  • 可复用性强;

第2节的困难点主要是因为总线的memory map区间划分数量繁多和变化频繁引起的,因此解决方法的思路也是从memory map映射到TB的格式入手。好的TB memory map格式可以起到事半功倍的效果,思路请看下文。

3.1 文件准备

假设有以下一个用Excel表示的简单总线memory map表格,它有三级,表1为全部的地址空间大小,表2为表1中IO区间的更小粒度划分区间(Region),表3为表2中SYS区间的更小粒度划分区间。

图1 Memory map在Excel中呈现的形式

Memory map表格的呈现形式具体可以和Designer讨论确定一种形式就好了,不一定要按上面的罗列的形式。

有了这个Excel表格的话,我们就可以写个脚本把每个区间的信息提取处理,包括区间的名字(Region name),起始地址(Start Address)和终止地址(End Address),以及区间和区间之间的所属关系等,比如表2中的TPIU/UART/…/SYS是IO区间的子区间,而表3的EWM/PLL/SDIO/BOOT是表2的子区间。

提取了这些信息有什么用呢?我们可以把每个区间或子区间都看作是一个SystemVerilog中的类(class)。如下图所示,这个类(Class: region)应包含了以下基本属性和方法。

图2 memory map转换成class表示的形式

Region class包含起止地址(start_addr, end_addr)和下一个子region(sub_region)的连接信息,如果一个区间没有再细分子区间,那么sub_region队列的大小为0。反之则不为0,比如图1中表1的IO区间下有5个子区间,那么IO类的sub_regions的大小将为5。然后IO区间下面的SYS子区间有更细分为4个子区间,那么SYS类的sub_regions的大小将为4。以此类推,层层嵌套。再比如表1的ROM区间没有被细分,那么ROM类的sub_regions的大小将为0。很简单,是吧。

每个紫色方框可以代表是图1中表1 Main region的一个区间,这样的话,会有5个紫色方框,map[enum]中的enum是表示enum类型,它的值是表1区间名的集合。

按以上方式形式的一个类似于金字塔的结果,最上面的是主区间,然后一层层往下细分为更新的区间,上级的区间拥有下一级区间的class句柄链接。而且所有区间都是使用region class来实现的,很方便TB通过嵌套方式来使用memory map。

另外既然memory map的每个区间都抽象为类了,那么SystemVerilog的所有语法可以用于操控它了,比如可以在start_addr和end_addr之间生成任意的地址访问。而且TB可以在class里实现诸多使用的方法(task, function)去处理数据,大大减少了重复代码。

另外通过将Excel的内容全部抽取转换为TB格式的mem_map类,TB可以逐级遍历去测试每个区间,再也不用担心漏了哪些地址区间没测了,也不怕RTL频繁改动。

当然,有一个小难点就是需要将Excel转换为图2形式的mem_map,这个我就不多讲了,脚本大家可以自己写,而且根据这个思路,可以实现很多有意思的功能,亲测实用。

3.2 效果展示

使用脚本把图1的Excel内容转成TB代码的参考代码如下:

// ==================================================================
// Main region: ROM
// ==================================================================
main[ROM] = region::type_id::create("ROM");
main[ROM].start_addr  = 'h8A0000000;
main[ROM].end_addr    = 'h99FFFFFFF;

// ==================================================================
// Main region: DDR
// ==================================================================
main[DDR] = region::type_id::create("DDR");
main[DDR].start_addr  = 'h120000000;
main[DDR].end_addr    = 'h89FFFFFFF;

// ==================================================================
// Main region: RESERVED_A
// ==================================================================
main[RESERVED_A] = region::type_id::create("RESERVED_A");
main[RESERVED_A].start_addr  = 'h41000000;
main[RESERVED_A].end_addr    = 'h11FFFFFFF;

// ==================================================================
// Main region: USB
// ==================================================================
main[USB] = region::type_id::create("USB");
main[USB].start_addr  = 'h40000000;
main[USB].end_addr    = 'h040FFFFFF;

// ==================================================================
// Main region: IO
// ==================================================================
main[IO] = region::type_id::create("IO");
main[IO].start_addr  = 'h0;
main[IO].end_addr    = 'h03FFFFFFF;
// Sub: TPIU  (IO -> TPIU)
sub_rgn = region::type_id::create("TPIU");
sub_rgn.start_addr  = 'h3D000000;
sub_rgn.end_addr    = 'h3FFFFFFF;
main[IO].sub_rgn.push_back(sub_rgn);
// Sub: UART  (IO -> UART)
sub_rgn = region::type_id::create("UART");
sub_rgn.start_addr  = 'h3C000000;
sub_rgn.end_addr    = 'h3CFFFFFF;
main[IO].sub_rgn.push_back(sub_rgn);
// Sub: GPU_REGISTER  (IO -> GPU_REGISTER)
sub_rgn = region::type_id::create("GPU_REGISTER");
sub_rgn.start_addr  = 'h3B000000;
sub_rgn.end_addr    = 'h3BFFFFFF;
main[IO].sub_rgn.push_back(sub_rgn);
// Sub: DMC_REGISTER  (IO -> DMC_REGISTER)
sub_rgn = region::type_id::create("DMC_REGISTER");
sub_rgn.start_addr  = 'h30000000;
sub_rgn.end_addr    = 'h3AFFFFFF;
main[IO].sub_rgn.push_back(sub_rgn);
// Sub: SYS  (IO -> SYS)
sub_rgn = region::type_id::create("SYS");
sub_rgn.start_addr  = 'h0;
sub_rgn.end_addr    = 'h2FFFFFFF;
main[IO].sub_rgn.push_back(sub_rgn);
// SubSub: EWM  (IO -> SYS -> EWM)
sub_rgn = region::type_id::create("EWM");
sub_rgn.start_addr  = 'h25000000;
sub_rgn.end_addr    = 'h2FFFFFFF;
main[IO].sub_rgn[$].sub_rgn.push_back(sub_rgn);
// SubSub: PLL  (IO -> SYS -> PLL)
sub_rgn = region::type_id::create("PLL");
sub_rgn.start_addr  = 'h21000000;
sub_rgn.end_addr    = 'h24FFFFFF;
main[IO].sub_rgn[$].sub_rgn.push_back(sub_rgn);
// SubSub: SDIO  (IO -> SYS -> SDIO)
sub_rgn = region::type_id::create("SDIO");
sub_rgn.start_addr  = 'h200000;
sub_rgn.end_addr    = 'h20FFFFFF;
main[IO].sub_rgn[$].sub_rgn.push_back(sub_rgn);
// SubSub: BOOT  (IO -> SYS -> BOOT)
sub_rgn = region::type_id::create("BOOT");
sub_rgn.start_addr  = 'h0;
sub_rgn.end_addr    = 'h001FFFFF;
main[IO].sub_rgn[$].sub_rgn.push_back(sub_rgn);

文章来源于 专芯致志er ,作者 沪闵菜菜子

创芯大讲堂开年钜惠,倒计时!

【芯片课·狂省25%】

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
肖战伴手礼太拉胯!十几块钱牙膏,一盒洗衣凝珠,网友:太浪漫了

肖战伴手礼太拉胯!十几块钱牙膏,一盒洗衣凝珠,网友:太浪漫了

娘娘不想上班
2026-10-23 19:20:21
李昌钰追思会曝光,捧遗像的是学生,捧骨灰的是继子,亲儿女没来

李昌钰追思会曝光,捧遗像的是学生,捧骨灰的是继子,亲儿女没来

王姐懒人家常菜
2026-10-24 09:29:48
被叫“花花公子”的宋承宪,一生只公开认过一个女友,如今50岁单身快9年

被叫“花花公子”的宋承宪,一生只公开认过一个女友,如今50岁单身快9年

糖炒小栗子
2026-10-24 15:26:47
养老金月入过万群体的心声:年轻人不生娃,不交社保,自私自利,还拖垮了社会养老体系

养老金月入过万群体的心声:年轻人不生娃,不交社保,自私自利,还拖垮了社会养老体系

舒山有鹿
2026-08-09 11:56:27
印度男子在美国机场顺走圣罗兰,被抓后辩解:自己平时只买中国产的便宜货,不认识这个大牌

印度男子在美国机场顺走圣罗兰,被抓后辩解:自己平时只买中国产的便宜货,不认识这个大牌

怪味历史连连看
2026-10-12 16:31:18
岳飞真容长啥样?真实画像被国家博物馆珍藏至今,原来岳飞长这样

岳飞真容长啥样?真实画像被国家博物馆珍藏至今,原来岳飞长这样

老范谈史
2026-10-03 20:05:04
续航2300km+油耗1.8L!比亚迪第六代DM‑i 6.0要让加油站倒闭?

续航2300km+油耗1.8L!比亚迪第六代DM‑i 6.0要让加油站倒闭?

阿芒娱乐说
2026-10-22 03:48:48
冯唐:烟搭桥,酒铺路,财挡灾——求人如吞三尺剑,靠人如上九重天

冯唐:烟搭桥,酒铺路,财挡灾——求人如吞三尺剑,靠人如上九重天

杏花烟雨江南的碧园
2026-10-19 16:15:03
这就是蒋经国情人章亚若的真实模样,清纯可爱,罕见老照片曝光!

这就是蒋经国情人章亚若的真实模样,清纯可爱,罕见老照片曝光!

微野谈写作
2026-10-10 11:40:08
等了22年,《死神》动画大结局定档10月26日

等了22年,《死神》动画大结局定档10月26日

生活观察员啊
2026-10-25 00:25:23
中期选举民调有假?特朗普出手了

中期选举民调有假?特朗普出手了

山河路口
2026-10-24 13:45:49
奥斯卡影后新片爱上"柳条丈夫",影评人却说这设定撑不起一部电影

奥斯卡影后新片爱上"柳条丈夫",影评人却说这设定撑不起一部电影

时光慢旅人
2026-10-24 00:11:51
四川省人民政府 重庆市人民政府印发通知,涉及凉山

四川省人民政府 重庆市人民政府印发通知,涉及凉山

云上凉山
2026-10-24 17:38:28
事情闹大了!菲律宾总统府声明,拒绝驱逐中方大使,原因很直白

事情闹大了!菲律宾总统府声明,拒绝驱逐中方大使,原因很直白

军情观察家
2026-10-24 14:25:34
锋无力就开倒车!双中卫破门,阿森纳2-0埃弗顿积分追平曼城

锋无力就开倒车!双中卫破门,阿森纳2-0埃弗顿积分追平曼城

智道足球
2026-10-25 00:10:55
女子半夜借口上厕所,约男网友发生关系,男网友嫌她长得丑不愿意,两人打起来,女子再次被发现身上盖满树叶

女子半夜借口上厕所,约男网友发生关系,男网友嫌她长得丑不愿意,两人打起来,女子再次被发现身上盖满树叶

丫头舫
2026-10-15 20:20:24
要变天!新首相上台就掀桌,直接废除前任计划!先打给了泽连斯基

要变天!新首相上台就掀桌,直接废除前任计划!先打给了泽连斯基

普览
2026-07-24 05:08:24
76岁盛海琳现状,16年前拼命生下的双胞胎,如今成了她的“盔甲”

76岁盛海琳现状,16年前拼命生下的双胞胎,如今成了她的“盔甲”

无处遁形
2026-10-18 14:17:13
七旬老太在养老院10年从不和人说话,去世后整理遗物,发现她的秘密

七旬老太在养老院10年从不和人说话,去世后整理遗物,发现她的秘密

温情邮局
2025-08-14 15:34:36
毛主席说“这是我决定的”,他回了一句“是你决定的也是错误的”

毛主席说“这是我决定的”,他回了一句“是你决定的也是错误的”

晓楖科普
2026-10-23 20:25:16
2026-10-25 02:52:49
EETOP半导体社区 incentive-icons
EETOP半导体社区
国内著名的电子工程师社区
8334文章数 15717关注度
往期回顾 全部

科技要闻

写程序、做3D,新Kimi还有多少本事?

头条要闻

澳官方扑杀200万只野猫 当地人直接搬出"全自动杀猫机"

头条要闻

澳官方扑杀200万只野猫 当地人直接搬出"全自动杀猫机"

体育要闻

从乐透秀到总冠军再到没工作 一共要几年?

娱乐要闻

翁虹19岁女儿三次拒爱,在美国上学却“不随便”

财经要闻

叫"保障"不叫"保险":租车平台的文字游戏

汽车要闻

大众安徽与众09正式上市 双十一权益价16.99万起

态度原创

本地
健康
手机
数码
公开课

本地新闻

这么近,那么美,周末赴贺州丨大湾区后花园

痘痘能根治吗?皮肤科医生说实话

手机要闻

第一批拿到iPhone Duo的人心态有点崩:真实用户没多少 都是黄牛

数码要闻

AMD显卡终于默认支持HDMI 2.1了!4K 120Hz满血输出:AI推理性能免费提升

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版