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

一种解决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-07-21 12:20:03
这很科学:89%的人幻想过同时和多人发生性行为,算精神出轨吗?

这很科学:89%的人幻想过同时和多人发生性行为,算精神出轨吗?

宇宙时空
2026-05-26 18:20:10
总决赛女排3-2美国爆冷!庄宇珊42中15!不要喷没她打不到第五局

总决赛女排3-2美国爆冷!庄宇珊42中15!不要喷没她打不到第五局

格斗社
2026-07-23 22:15:58
中国官宣126公里台海通道,两岸统一迈出关键一步

中国官宣126公里台海通道,两岸统一迈出关键一步

命运自认幽默
2026-07-23 15:55:09
中小学入学迎来重大调整,教育部已经下达通知,2026年9月1日全国统一执行

中小学入学迎来重大调整,教育部已经下达通知,2026年9月1日全国统一执行

每天分享天下事
2026-07-20 17:30:27
中国的文物有多逆天?被考古学家怀疑是穿越者带回去的……

中国的文物有多逆天?被考古学家怀疑是穿越者带回去的……

神奇故事
2026-07-23 00:56:12
糖尿病一口番茄不能尝?再次强调:不想得糖尿病肾病,远离这6物

糖尿病一口番茄不能尝?再次强调:不想得糖尿病肾病,远离这6物

路医生健康科普
2026-07-23 17:42:42
国产手机又掀起新一轮涨价潮 店员:一个512G存储就值1000多元

国产手机又掀起新一轮涨价潮 店员:一个512G存储就值1000多元

快科技
2026-07-23 21:57:04
彻查!信号强烈!中央升级反腐“天网”!

彻查!信号强烈!中央升级反腐“天网”!

职场资深秘书
2026-07-23 18:32:35
中国不顾一切玩了命的发展军事!这是为什么?真实原因让人意外!

中国不顾一切玩了命的发展军事!这是为什么?真实原因让人意外!

万物知识圈
2026-07-23 09:53:50
当出差长期住在一家酒店会发生什么趣事?网友:我成编外人员了

当出差长期住在一家酒店会发生什么趣事?网友:我成编外人员了

夜深爱杂谈
2026-07-18 20:49:53
全球最大推土机制造商年收入5100亿,相当于5个徐工集团

全球最大推土机制造商年收入5100亿,相当于5个徐工集团

快乐彼岸
2026-07-21 05:43:31
BBA价格崩了,国产电车也没赢麻

BBA价格崩了,国产电车也没赢麻

老凤说财经
2026-07-21 17:05:25
入籍近20年,美国公民身份永久被撤销!男子同意主动遣返原籍国

入籍近20年,美国公民身份永久被撤销!男子同意主动遣返原籍国

华人生活网
2026-07-23 01:47:56
特朗普宣布解除40多年禁令:允许所有美国航司直飞黎巴嫩!与黎总统会面时特朗普开心大笑:他可太懂怎么讨我欢心了,他想要什么都可以

特朗普宣布解除40多年禁令:允许所有美国航司直飞黎巴嫩!与黎总统会面时特朗普开心大笑:他可太懂怎么讨我欢心了,他想要什么都可以

每日经济新闻
2026-07-22 14:47:26
刁琳宇盘活全队,龚翔宇太出彩!绝杀美国,老将才是女排定海神针

刁琳宇盘活全队,龚翔宇太出彩!绝杀美国,老将才是女排定海神针

金毛爱女排
2026-07-23 21:57:47
成为主持人仅9个月,就与汪涵、何炅搭档,如今低调隐婚嫁富二代

成为主持人仅9个月,就与汪涵、何炅搭档,如今低调隐婚嫁富二代

枫尘余往逝
2026-07-22 21:54:03
罗家英说周星驰现在不用香港演员了

罗家英说周星驰现在不用香港演员了

静若梨花
2026-07-23 22:01:33
深圳巨盘:桃源居,换物业投票,结果已出,“符合大多数人预期”

深圳巨盘:桃源居,换物业投票,结果已出,“符合大多数人预期”

童童聊娱乐啊
2026-07-23 18:01:23
日本漫画作者宣布停更:AI禁令不解除,我就不画了

日本漫画作者宣布停更:AI禁令不解除,我就不画了

国创漫话
2026-07-20 23:44:07
2026-07-24 00:07:00
EETOP半导体社区 incentive-icons
EETOP半导体社区
国内著名的电子工程师社区
7946文章数 15688关注度
往期回顾 全部

科技要闻

中国数学家王虹、邓煜获菲尔兹奖

头条要闻

女副部王峻被处理:大搞权钱交易 泄露工作秘密

头条要闻

女副部王峻被处理:大搞权钱交易 泄露工作秘密

体育要闻

勇士24岁的MVP,也是个勒布朗?

娱乐要闻

梁朝伟汤唯19年后境遇反转

财经要闻

梁文锋当不成赛博圣人

汽车要闻

领克07GT正式上市14.58万起 把纯粹驾趣还给旅行

态度原创

本地
旅游
健康
房产
公开课

本地新闻

跟着影视去旅行:西游篇

旅游要闻

乌蒙山深处藏奇观,巨型天坑横卧群山,坑底村落背后藏着一段往事

我是不是中风高风险人群?快速自测

房产要闻

狂抢111轮,溢价39%,楼面价刺破9500!海口土拍杀疯了!

公开课

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

无障碍浏览 进入关怀版