0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SystemC的随机验证过程是怎样的?

sanyue7758 来源:处芯积律 2023-08-07 09:43 次阅读

SystemC是基于C++的系统级设计语言,兼具描述硬件电路模型和面向对象的抽象能力。在芯片设计开发中,常用于芯片架构的建模、性能仿真和评估、软硬件联合仿真等场景。尤其是在融合TLM2.0事务级建模方法以后,SystemC的模型也出现事务级、cycle级等不同抽象等级的划分,用于不同的场景需求。

随着基于systemC建模的广泛适用,对SC模型的验证也是应运而生;正如Systemverilog用于对verilog的验证。SystemC Verification (SCV)就是SC中的一个验证库,其包含了:

transaction-based verification

data introspection

constrainted and weighted randomization

01cc2b1a-3473-11ee-9e74-dac502259ad0.png

这篇文章准备介绍SCV中的约束随机:constrainted randomization。在systemverilog中随机约束是CDV的一大利器,SV中具有丰富的随机表达语法,比如inside、dist、solve before、->、unique等。C/C++中却不具备如此丰富的约束能力,而SCV作为SC的验证库,引入了约束随机描述。

Basic Randomization

无论是sc内建的基本数据类型,如sc_int/sc_uint等;还是自定义的struct数据,都可以使用scv_smart_ptr修饰,进行基本的随机化操作。常见的用法如下:

//基本数据类型随机
scv_smart_ptr< sc_uint<8> > data; 
data->next(); 
//自定义数据结构随机
struct packet_t { 
int data; 
int array[10]; 
}; 
scv_smart_ptr< packet_t > p; 
// generate a random value and assign it to the data field 
p->data.next(); 


//generate a random value and assign it to the array element with index 3 
p->array[3].next(); 


// generate random values for all fields and all array elements 
p->next(); 


// generate random values for all fields and all array elements, 
//except for the data field
p->data.disable_randomization(); 
p->next();

scv_smart_ptr会例化一个内部的随机对象,使用next方法产生随机值。
对于自定义符合数据结构,也可以只针对其中部分参数进行随机;不需要随机的参数,使用disable_randomization关闭随机。

Constrained Randomization

上述的简单约束,可以使用scv_smart_ptr实现。对于其他的复杂约束,则需要借助scv_constraint_base实现。(scv_smart_ptr可以认为是systemverilog中的random函数,而constraint或者solve-before,则必须要在class中实现)。
用法如下:

class write_constraint : virtual public scv_constraint_base { 
public: 
scv_smart_ptr< rw_task_if::write_t > write; 
SCV_CONSTRAINT_CTOR(write_constraint) { 
SCV_CONSTRAINT( write->addr() < 0x00FF ); 
SCV_CONSTRAINT( write->addr() != write->data() ); 
} 
}; 
//上面SCV代码的systemverilog等效格式:
class write_constraint extend scv_constraint_base ; 
rand rw_task_if::write_t  write; 
constraint write_constraint { 
write.addr < 0x00FF; 
write.addr != write.data; 
} 
endclass

在scv_constraint_base扩展出的子类中,需要随机的参数仍需要使用scv_smart_ptr修饰。使用SCV_CONSTRAINT_CTOR声明一段约束,SCV_CONSTRAINT用于添加一条约束表达式。
约束表达式可以支持:算术表达式(+,-,*,/),关系表达式(==, !=, >, >=, <, <=),逻辑表达式( !, &&, ||)。约束表达式有三种:

1.SCV_CONSTRAINT代表是一种hard constraint;

2.SCV_SOFT_CONSTRAINT表达一种soft constraint;

3. SCV_BASE_CONSTRAINT代表基类中的约束。

此处的hard和soft constraint含义和systemverilog中soft修饰随机的含义基本一致。

上述的随机类定义好后,便可以进行实例化和随机。前面提到的disable_randomization仍然可以使用,并且统一使用next方法进行随机生成。

write_constraint c("write constraint"); 
for (int i=0; i<2; ++i) { 
c.next(); 
cout << *c.write << endl; 
} 


write_constraint c("write constraint"); 
c.write->addr->disable_randomization(); 
for (int i=0; i<2; ++i) { 
c.write->addr = i; 
c.next(); 
cout << *c.write << endl; 
}

Weight and Biased Randomization

在systemverilog随机约束中,经常会使用到inside、dist,用来表达带有权重的随机。同样,SCV支持指定范围随机和带权重的随机,通过scv_bag实现。scv_bag可以用来收集需要范围随机信息以及权重信息。
单值权重设置使用scv_bag表达,实例:

scv_bag bag; 
bag.push(1,60); 
bag.push(2,40); 
scv_smart_ptr data; 
data->set_mode(bag); 
data->next(); 
//systemverilog的等效表达
rand int data;
data dist {1:/60,2:/40};

在scv_bag收集好权重信息后,通过set_mode函数传递给参数的随机对象即可。范围权重设置使用scv_bag< pair< int,int> >表达,实例:

scv_smart_ptr data; 
scv_bag< pair< int,int> > distribution; 
distribution.push( pair(0,1), 40); 
distribution.push( pair(2,10), 60); 
data->set_mode(distribution); 
data->next(); 
//systemverilog的等效表达
rand int data;
data dist {[0:1]:/60,[2:10]:/40};

从上面可以看出如果需要添加范围约束和权重约束,就必须要定义scv_bag,添加约束范围和权重,并通过set_mode设置,稍显复杂。因此SCV中引入keep_only和keep_out方法,用于添加随机约束范围,类似systemverilog中的inside和~inside。

scv_smart_ptr i; 
i->keep_only(0,4); 
i->keep_out(2); 
i->next(); 
// generate a value among { 0, 1, 3, 4 } 
//如果使用scv_bag方式,方法如下:
scv_smart_ptr i; 
scv_bag bag; 
bag.add(0); bag.add(1); bag.add(3);bag.add(4);  
i->next();

keep_only和keep_out除了可以接受固定数值外,还可以接收list类型的变量。

scv_smart_ptr i; 
list i_range;
i_range.push_back(0);
i_range.push_back(4);
i->keep_only(i_range); 
i->keep_out(2); 
i->next(); 
// generate a value among { 0, 3, 4 }

总结来看,设置随机约束有如下方式:

set_mode方法

keep_only、keep_out方法

SCV_CONSTRAINT约束表达式

set_mode和keep_only/out的随机约束设置会进行覆盖。使用reset_distribution方法可以取消set_mode和keep_only/out方法设置的随机约束。实例如下:

scv_smart_ptr i; 
i->keep_only(0,4); 
i->keep_out(2); 
i->next(); // generate a value among { 0, 1, 3, 4 } 
 
scv_bag b; 
b.add(2); b.add(7); 
i->set_mode(b); 
i->next(); // generate a value among {2,7} 


i->reset_distribution(); 
i->next(); // generate a value between INT_MIN and INT_MAX.

写在最后

SCV 约束除了作为SC模型的验证随机约束外,一方面可以把SC模型阶段的验证激励复用到中后期的RTL验证;

0203e56e-3473-11ee-9e74-dac502259ad0.png

另一方面还可以在CPU核相关的C语言case中使用,由于SCV是基于C/C++语言,因此可以比较容易地和C based case结合,具体融合方式需要一些转接件,这个后续有机会再做介绍。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片设计
    +关注

    关注

    15

    文章

    900

    浏览量

    54420
  • 仿真器
    +关注

    关注

    14

    文章

    988

    浏览量

    82998
  • C语言
    +关注

    关注

    180

    文章

    7534

    浏览量

    128852
  • RTL
    RTL
    +关注

    关注

    1

    文章

    377

    浏览量

    59077
  • Verilog语言
    +关注

    关注

    0

    文章

    113

    浏览量

    8160

原文标题:聊聊SystemC的验证随机

文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    [1.6.1]--1.6.1学习视频-典型随机过程

    随机过程
    jf_75936199
    发布于 :2023年03月09日 01:01:58

    如何在ModelSim下用SystemC的做验证

    如何在ModelSim下编译和仿真SystemC的设计?如何在ModelSim下用SystemC的做验证SystemC作为一种系统级设计与验证
    发表于 03-01 11:30

    如何基于uvm方法学采用systemc进行IC验证?

    请教各位大佬,UVM是基于sv的验证方法学,如果采用systemc语言编程,如何实现?
    发表于 11-07 15:30

    怎样去描述RRM测试中的随机接入过程

    怎样去介绍随机接入过程随机接入过程包括哪些步骤?RRM测试中对随机接入有哪些硬性规定?
    发表于 04-15 06:42

    硬件验证语言——简介

    HDL 中的易于位级操作的特性。许多 HVL 将提供受约束的随机激励生成和功能覆盖构造,以协助进行复杂的硬件验证。如果 HDL 意味着设计,那么 HVL 意味着验证那些 HDL 代码。 现在问题来了
    发表于 02-16 13:36

    SystemC进行SoC的系统级设计与仿真

    IC 技术已发展到SoC 阶段,系统级设计、仿真和验证已成为IC 设计面临的巨大挑战。SystemC 是新兴的系统级设计语言,为复杂系统的设计与验证提供了解决方案。本文介绍SystemC
    发表于 05-18 13:44 28次下载

    设计验证中的随机约束

    随机约束在现代集成电路验证中已得到国际IC 设计业界的普遍认可,并逐渐开始普及。与传统的定向测试比较,它在验证效率、验证覆盖率等方面具有诸多优势。最新公布的Sys
    发表于 12-14 09:54 13次下载

    基于SystemC的系统验证研究和应用

    视频编解码芯片中运动估计与补偿单元(MECU)的算法复杂,使用传统硬件描述语言建立模型和模型验证过程繁琐耗时,为了缩短芯片验证时间,本文针对MECU模块提出了基于SystemC语言
    发表于 02-24 12:07 16次下载

    应用随机过程

    应用随机过程是现代应用随机过程教材,内容从入门知识到学术前沿,包括预备知识、随机过程的基本类型、
    发表于 03-19 08:47 0次下载

    数字专用集成电路设计中的SystemC建模验证方法

    数字专用集成电路设计中的SystemC建模验证方法
    发表于 07-17 16:36 31次下载

    SystemC 和SystemVerilog的比较

    SystemC 和 SystemVerilog 这两种语言而言, SystemC 是C++在硬件支持方面的扩展,而 SystemVerilog 则继承了 Verilog,并对 Verilog 在面向对象和验证能力方面进行了扩
    发表于 08-16 10:52 5173次阅读

    SystemC验证方法和流程介绍

    SystemC 是由C++衍生而来,本质是在C++的基础上添加了硬件扩展库和仿真核,这使SystemC 可以在不同抽象级对复杂电子系统建模。
    发表于 07-19 11:55 4762次阅读
    <b class='flag-5'>SystemC</b> 的<b class='flag-5'>验证</b>方法和流程介绍

    采用SystemC ESL设计的九个理由

    支持SystemC的电子系统级(ESL)设计和验证环境旨在设计,分析,优化和验证片上系统(SoC)平台模型。这样的环境构成了已建立的RTL实现流程的前端。
    的头像 发表于 10-03 17:05 4643次阅读

    看看使用芯片验证随机带来的六宗罪

    以前看到不少验证技术书籍都在说验证环境中随机怎么怎么好,然后为了随机,UVM,SV 提供了什么什么支持。
    的头像 发表于 04-10 11:21 419次阅读

    怎样设计和验证TRL校准件以及TRL校准的具体过程

    怎样设计和验证TRL 校准件以及TRL 校准的具体过程
    发表于 12-14 09:40 0次下载