浅谈Model之二:Wreal,一个集速度与精度于一身的才子
时间:12-12
整理:3721RD
点击:
欢迎关注公众号“模拟混合信号设计验证”(yaliDV)来看图文并茂的文章。另外“IC咖啡学堂|模拟混合信号设计验证”微信群已经开启,需要加入的话请联系t348841316以便邀请入群。
导读
Wreal是VerilogAMS里面的一个keyword,为啥这里特别拎出来讲呢?因为它是一个集速度与精度于一身的才子,为什么这么说呢?它有哪些特权呢?它和Electrical之间有啥桥梁嫁接的故事呢?且听此文介绍。
谈完Model的概览,我们本章节来深入一个技术细节,那就是wreal,一个集速度与精度于一身的才子。本文主要从wreal的定义、特性讲起,再介绍wreal的特权和局限,然后再讲讲wreal和Electrical之间桥梁嫁接的故事:怎么样从wreal转成Electrical(R2E),以及怎么从Eletrical转成wreal(E2R)。
Wreal之定义
Wreal,这个名字取得非常有含义,w开头的,自然让人想到了wire,对,wreal的信号就是可以做端口、做port的;后面的real,又提示了它是一个variable,而且它不像整数integer,更不像数字0,1,它是一个real,一个浮点实数,是一个可以连续变化的量。它的科学定义就是“A real valued wire”,言简意赅,本次文章主要参考资料还是Cadence Manual,只不过我应该比它讲的有趣点,另外再捎带扯点与其相关的知识。一个能够做wire,又能连续变化的variable,有什么好处呢?其实,其中一个非常好的作用,就是可以做model,也可用用来做verification。wreal只有在verilogAMS中有,在systemVerilog和VHDL中只有real,没有wreal,因为他们自带当port的功能。
如果一根线是wreal,仿真器怎么处理它呢?首先非常恭喜的是,仿真器处理它的是时候不用去一步三回头了、不用再想什么基尔霍夫电压定律、基尔霍夫电流定律了,因为 是wreal在时间上是离散的:它只根据离散的event来变化;所以它是用digital solver来解决问题。但是同时呢,它还可以是有很多Analog的痕迹的,因为它不是简单的0,1,x,z的时候,而且一串串浮点数,所以和连续变化的模拟信号还是非常接近的。这也是为啥用wreal来做Real valued model(RVM)的原因。可以直接看下表(绿色填充色为优势点):可以说Wreal是将Digital和Analog仿真器两者的优点给综合到了一起。
这种神奇的怪物,在仿真速度和精度之间取得了一个非常好的折中。Wreal有很多Analog的痕迹,可以保证精度。而同时,它也具有了好多数字化处理的机会。先进的random,coverage概念,assertion-based verification等概念,也可以通过这种转化,而间接的利用到Analog 信号上。这就是既拥有豹的速度、又具有苍鹰般敏锐、见微知著的眼睛,集速度和精度于一身的大才子。
这里给一个最最简单的wreal的语法例子如下。Input/output可以是wreal,可以用在always等语句里面,因为wreal在时间上是自由的、离散的;所以不用蹲班在“analog”procedure里面了,直接去digital里面high起来。
input a;
wreal a;
always @(a) begin
…
end a 可以是一个input, output,也可以是一个在always @ 里面的事件(因为wreal在时间上是离散的)
wreal在vams中的“特权”与局限
虽然题目是“特权”与局限,其实wreal的特权特别多,而局限比较少。
由于wreal强大的综合digital和Analog仿真器的特点,它在VerilogAMS中的应用也被扩展的非常广泛,换句话说它的特权很多:在IES8.2中,它可以是arrays,(来来来,考试题来一道:array和bus有啥区别?最简单的理解就是:Bus是写在前面的: [3:0] bus; array 是写在后面的: array[3:0]; )它可以被多驱动:例如SUM/AVG/MIN/MAX等。它也可以被用在Table Model中(前面介绍过,大数据)。Wreal也可以被连接到System Verilog的real变量上。Digital中有x/z,wreal也有wrealXState和wrealZState相对应,也是对应一个表示未知、一个表示高阻。
虽然说是只有Verilogams中有wreal;但是它依然是能够和其他语言兼容的:SystemVerilog中的real,以及VHDL中的real signals,都行。仿真器在Elaboration的时候,会将他们给统统消化一遍,然后大家就能相互认识了(coercion to wreal)。
不过,wreal也是有局限性的。毕竟用的Solver不是Analog的了;它还是没有Electrical精致。除了仿真器的区别外,wreal也不能反映频域信息,而且也不能反映负载等信息。所以,就像大家非常熟知的一个大系统,通常ADC进去,再DAC出来;Wreal和Electrical之间,需要类似ADC/DAC的玩意,这就是Connect Modules (CM)。这里解释一下啥叫Connect Modules (CM) ,它就是仿真器在elaboration的时候,怎么样自动化的给不同的block、不同的signal domains加上联系、怎么整合起来。
Connect Modules (CM)有好多种类型。咱们这里就主要介绍Wreal和Electrical之间的故事了。见下图,wreal之快就像小汽车;而Electrical之慢就像自行车。从Electrical到wreal ,简称为E2R,而从wreal到Electrical会被简称为R2E。下面咱们就分别介绍下他们这哥俩。
R2E(wreal to electrical)
这个你只要知道有Analog这个procedural,知道里面有个重要的词语叫做transition,就基本成了。R2E最简单的就是通过一个transition函数,一个digitaldomain的东西马上就被连续化了:
V(w_electrical) <+ transition(w_wreal, td, tr, tf, ttol)
严格的代码可以去看Cadence的Manual。在仿真器“自动”给你插R2E的时候,它会把一个wreal转化成电流电压,其中电压源的内阻默认是200欧姆,如果你的内阻肯定不是200 这个数量级的,那么最好请自助,自己写这个玩意。也就是说不要总是相信仿真器自动给加上的东西,你要根据自己的需求来设置。default的设置,仿真器考虑的是大部分时候的应用情况。不过实际情况是,很多时候你就是那个例外!正所谓担心啥偏偏来啥,妥妥的墨菲定律。这也是为啥说写model也需要经验,经验积累不够,写出来的model用了还不如不用。
E2R(Electrical to wreal)
说完了wreal转Electrical,咱们再反过来看看Electrical转wreal,这其实也是非常必要的。估计这才是很多Analog工程师所关注的。毕竟他们天天看到的都是Electrical的信号,但是对于其中很多,他们或许并不需要那么高的精度,例如控制信号、还有高频振动的clk信号等。
一个非常有意思的事情是,问大家一下,一个类似方波的CLK信号和一个sine信号,谁会占用更长的仿真时间呢?如果本能的想CLK不就类似于0,1嘛,应该会快的;这在纯analog领域,就错了。方波在转折点附近,Analog仿真器工作起来是很吃力的,因为它总是在一步三回头,你突然之间,就要准备转折了,步步和前面有区别,仿真器是要花费大量的精力来搞清楚你想干什么的,所以表面上看只有高低电平,但是实际各种转折点都是耗时耗力的;甚至速度还追不上光滑的sine信号。所以这种拖累机器的信号,wreal化,甚至digital化,都非常必要。
还有一个据说是非常经典的问题,它问到:不同的模块需要的time step 差别很大,几十倍,现在有没有工具能很好的解决这个问题。其实我个人认为这个问题本质就是想在保证精度的情况下提高速度,所以将Electrical转成wreal就是不失为一个非常好的选择。尽量的利用digital仿真器就是加速的好办法;利用 wreal又尽可能的保持了信号的原始面貌。
说完了Electrical转wreal的必要性,咱们再来看看具体怎么操作。Electrical转wreal,其实这个想象也不难,把一个Electrical的信号,经过一定的规则给采样出来,不就是real value了么?但是对应的VerilogAMS里面的keyword是啥呢?这就是”absdelta”,它专门干这个事情。absdelta的语法如下:
absdelta ( expr, delta [ ,time_tol [ , expr_tol ]]
看着很复杂,简单的说一下,就是说当对electrical采样的时候,总不能还和Analog仿真器一样的精度吧?如果和它一样的精度,那有啥速度提高呢?还干这个事情干嘛呢,回家好好蹲在Analog里面不就是了么!所以要采样,肯定只有当Electrical信号,例如电压信号,它变化到一定的级别了:即大于delta了(严格意义上说是delta +/- expr_tol)再说。这是对数值方面的限制。
先把这个大方向理解了,有人又要问了,那expr_tol是干嘛的呢?其实expr_tol在信号方向转变时候才会起作用。例如一个信号本来是正在上升,结果它突然间从上升改成下降了,这么重要的趋势变化,虽说不比数值,但是也是件重要的事情,所以当信号方向变化的时候,最好也是要采样的;但是又不能用之前说的delta,因为那个delta实在太大了;就像我们平时在开车走在康庄大直道的话,速度可以是很快的,但是如果要转弯的时候,速度是要降下来的,这时候就需要更高的采样精度了。还是我们不可能事无巨细的频繁采样,所以也就再给了它一个tolerance限制:expr_tol;如果一个信号你在转弯,那么你必须大于expr_tol,我才注意到你、才采样你;如果你的转弯小于expr_tol,我就以为你只是在开车画龙而已,不是转弯、不入我法眼。
但是光有数值方面的限制还是不够的。我们前面说过,仿真器要处理的事情有两件,一件确实是数值,还有一件,那就是时间。如果不对采样间隔的时间进行限制,那么就可能出现一种情况,信号的数值在高速的变化,每次变化都很大,那么采样还是会搞出来好多数据,对仿真速度提升不高。所以time_tol这个参数也非常重要,一个信号,如果刚采样过你,你在小于time_tol的时间内,又变了好多,我是不采样的,只有过了time_tol再说。
总结下,就是首先呢,当信号在康庄大路行驶的时候,我的采样间距就是vdelta;但是如果信号要转弯、换方向了,那就得慢速下来小精度expr_tol了。另外每次采样是有时间间隔的,大于time_tol呢,我才可能干活,否则是我调整时间、坚决不工作。简单记住下面这个表格就OK了:
有了这个函数,就好办多了,只要总是 always monitor一个electrical信号,并且把它赋值给一个wreal信号,就顺利实现了E2R了:
always @(absdelta(V(w_electrical), vdelta, ttol, vtol))
W_wreal =V(w_electrical);
仿真器里面,它会把vdelta默认成电源的1/64;而vtol呢,是1/64的再1/4,即是vdelta的1/4。ttol默认是10ps,当然这些你都可以自己改。你可以自己在做model的时候,写上类似的代码,这时候就不是仿真器偷偷的、自动的给你加E2R了,而且你自己积极主动的掌控了这种E2R的节奏。例如,对于一些电平检测信号,以前传统做法就是直接0,1,但是这样子太粗糙了;这里你就可以把档期根据电平级别,设置成四五个不同级别;每个的vdelta并不需要像1/64那么大,或许只要1/20就足够了;ttol也是,直接设置到ns级就可以。但是比方说有一些信号,非常sensitive,你很关心它,那么你甚至可以设置成vdelta 1/128;保证你model里面用的足够精准(不过这显然损失了速度;记住,absdelta也是消耗仿真器的!永远的no pay,no gain)。
R2E & E2R 总结
把上文的E2R 和R2E connection module中最精华的code再简单总结如下表,方便快速查询:
好了,这就是集速度和精度于一身的wreal大才子,今天就介绍到这里了。熟悉了wreal,写model,保证精度的同时,让速度飞起来就不是梦了。
声明
本文归“模拟混合信号设计验证”公众号所有,转载请务必说明出处。多谢!
欢迎关注公众号“模拟混合信号设计验证”(yaliDV)来看图文并茂的文章。另外“IC咖啡学堂|模拟混合信号设计验证”微信群已经开启,目前已经超过100人,所以需要加入的话请联系t348841316以便邀请入群。
导读
Wreal是VerilogAMS里面的一个keyword,为啥这里特别拎出来讲呢?因为它是一个集速度与精度于一身的才子,为什么这么说呢?它有哪些特权呢?它和Electrical之间有啥桥梁嫁接的故事呢?且听此文介绍。
谈完Model的概览,我们本章节来深入一个技术细节,那就是wreal,一个集速度与精度于一身的才子。本文主要从wreal的定义、特性讲起,再介绍wreal的特权和局限,然后再讲讲wreal和Electrical之间桥梁嫁接的故事:怎么样从wreal转成Electrical(R2E),以及怎么从Eletrical转成wreal(E2R)。
Wreal之定义
Wreal,这个名字取得非常有含义,w开头的,自然让人想到了wire,对,wreal的信号就是可以做端口、做port的;后面的real,又提示了它是一个variable,而且它不像整数integer,更不像数字0,1,它是一个real,一个浮点实数,是一个可以连续变化的量。它的科学定义就是“A real valued wire”,言简意赅,本次文章主要参考资料还是Cadence Manual,只不过我应该比它讲的有趣点,另外再捎带扯点与其相关的知识。一个能够做wire,又能连续变化的variable,有什么好处呢?其实,其中一个非常好的作用,就是可以做model,也可用用来做verification。wreal只有在verilogAMS中有,在systemVerilog和VHDL中只有real,没有wreal,因为他们自带当port的功能。
如果一根线是wreal,仿真器怎么处理它呢?首先非常恭喜的是,仿真器处理它的是时候不用去一步三回头了、不用再想什么基尔霍夫电压定律、基尔霍夫电流定律了,因为 是wreal在时间上是离散的:它只根据离散的event来变化;所以它是用digital solver来解决问题。但是同时呢,它还可以是有很多Analog的痕迹的,因为它不是简单的0,1,x,z的时候,而且一串串浮点数,所以和连续变化的模拟信号还是非常接近的。这也是为啥用wreal来做Real valued model(RVM)的原因。可以直接看下表(绿色填充色为优势点):可以说Wreal是将Digital和Analog仿真器两者的优点给综合到了一起。
这种神奇的怪物,在仿真速度和精度之间取得了一个非常好的折中。Wreal有很多Analog的痕迹,可以保证精度。而同时,它也具有了好多数字化处理的机会。先进的random,coverage概念,assertion-based verification等概念,也可以通过这种转化,而间接的利用到Analog 信号上。这就是既拥有豹的速度、又具有苍鹰般敏锐、见微知著的眼睛,集速度和精度于一身的大才子。
这里给一个最最简单的wreal的语法例子如下。Input/output可以是wreal,可以用在always等语句里面,因为wreal在时间上是自由的、离散的;所以不用蹲班在“analog”procedure里面了,直接去digital里面high起来。
input a;
wreal a;
always @(a) begin
…
end a 可以是一个input, output,也可以是一个在always @ 里面的事件(因为wreal在时间上是离散的)
wreal在vams中的“特权”与局限
虽然题目是“特权”与局限,其实wreal的特权特别多,而局限比较少。
由于wreal强大的综合digital和Analog仿真器的特点,它在VerilogAMS中的应用也被扩展的非常广泛,换句话说它的特权很多:在IES8.2中,它可以是arrays,(来来来,考试题来一道:array和bus有啥区别?最简单的理解就是:Bus是写在前面的: [3:0] bus; array 是写在后面的: array[3:0]; )它可以被多驱动:例如SUM/AVG/MIN/MAX等。它也可以被用在Table Model中(前面介绍过,大数据)。Wreal也可以被连接到System Verilog的real变量上。Digital中有x/z,wreal也有wrealXState和wrealZState相对应,也是对应一个表示未知、一个表示高阻。
虽然说是只有Verilogams中有wreal;但是它依然是能够和其他语言兼容的:SystemVerilog中的real,以及VHDL中的real signals,都行。仿真器在Elaboration的时候,会将他们给统统消化一遍,然后大家就能相互认识了(coercion to wreal)。
不过,wreal也是有局限性的。毕竟用的Solver不是Analog的了;它还是没有Electrical精致。除了仿真器的区别外,wreal也不能反映频域信息,而且也不能反映负载等信息。所以,就像大家非常熟知的一个大系统,通常ADC进去,再DAC出来;Wreal和Electrical之间,需要类似ADC/DAC的玩意,这就是Connect Modules (CM)。这里解释一下啥叫Connect Modules (CM) ,它就是仿真器在elaboration的时候,怎么样自动化的给不同的block、不同的signal domains加上联系、怎么整合起来。
Connect Modules (CM)有好多种类型。咱们这里就主要介绍Wreal和Electrical之间的故事了。见下图,wreal之快就像小汽车;而Electrical之慢就像自行车。从Electrical到wreal ,简称为E2R,而从wreal到Electrical会被简称为R2E。下面咱们就分别介绍下他们这哥俩。
R2E(wreal to electrical)
这个你只要知道有Analog这个procedural,知道里面有个重要的词语叫做transition,就基本成了。R2E最简单的就是通过一个transition函数,一个digitaldomain的东西马上就被连续化了:
V(w_electrical) <+ transition(w_wreal, td, tr, tf, ttol)
严格的代码可以去看Cadence的Manual。在仿真器“自动”给你插R2E的时候,它会把一个wreal转化成电流电压,其中电压源的内阻默认是200欧姆,如果你的内阻肯定不是200 这个数量级的,那么最好请自助,自己写这个玩意。也就是说不要总是相信仿真器自动给加上的东西,你要根据自己的需求来设置。default的设置,仿真器考虑的是大部分时候的应用情况。不过实际情况是,很多时候你就是那个例外!正所谓担心啥偏偏来啥,妥妥的墨菲定律。这也是为啥说写model也需要经验,经验积累不够,写出来的model用了还不如不用。
E2R(Electrical to wreal)
说完了wreal转Electrical,咱们再反过来看看Electrical转wreal,这其实也是非常必要的。估计这才是很多Analog工程师所关注的。毕竟他们天天看到的都是Electrical的信号,但是对于其中很多,他们或许并不需要那么高的精度,例如控制信号、还有高频振动的clk信号等。
一个非常有意思的事情是,问大家一下,一个类似方波的CLK信号和一个sine信号,谁会占用更长的仿真时间呢?如果本能的想CLK不就类似于0,1嘛,应该会快的;这在纯analog领域,就错了。方波在转折点附近,Analog仿真器工作起来是很吃力的,因为它总是在一步三回头,你突然之间,就要准备转折了,步步和前面有区别,仿真器是要花费大量的精力来搞清楚你想干什么的,所以表面上看只有高低电平,但是实际各种转折点都是耗时耗力的;甚至速度还追不上光滑的sine信号。所以这种拖累机器的信号,wreal化,甚至digital化,都非常必要。
还有一个据说是非常经典的问题,它问到:不同的模块需要的time step 差别很大,几十倍,现在有没有工具能很好的解决这个问题。其实我个人认为这个问题本质就是想在保证精度的情况下提高速度,所以将Electrical转成wreal就是不失为一个非常好的选择。尽量的利用digital仿真器就是加速的好办法;利用 wreal又尽可能的保持了信号的原始面貌。
说完了Electrical转wreal的必要性,咱们再来看看具体怎么操作。Electrical转wreal,其实这个想象也不难,把一个Electrical的信号,经过一定的规则给采样出来,不就是real value了么?但是对应的VerilogAMS里面的keyword是啥呢?这就是”absdelta”,它专门干这个事情。absdelta的语法如下:
absdelta ( expr, delta [ ,time_tol [ , expr_tol ]]
看着很复杂,简单的说一下,就是说当对electrical采样的时候,总不能还和Analog仿真器一样的精度吧?如果和它一样的精度,那有啥速度提高呢?还干这个事情干嘛呢,回家好好蹲在Analog里面不就是了么!所以要采样,肯定只有当Electrical信号,例如电压信号,它变化到一定的级别了:即大于delta了(严格意义上说是delta +/- expr_tol)再说。这是对数值方面的限制。
先把这个大方向理解了,有人又要问了,那expr_tol是干嘛的呢?其实expr_tol在信号方向转变时候才会起作用。例如一个信号本来是正在上升,结果它突然间从上升改成下降了,这么重要的趋势变化,虽说不比数值,但是也是件重要的事情,所以当信号方向变化的时候,最好也是要采样的;但是又不能用之前说的delta,因为那个delta实在太大了;就像我们平时在开车走在康庄大直道的话,速度可以是很快的,但是如果要转弯的时候,速度是要降下来的,这时候就需要更高的采样精度了。还是我们不可能事无巨细的频繁采样,所以也就再给了它一个tolerance限制:expr_tol;如果一个信号你在转弯,那么你必须大于expr_tol,我才注意到你、才采样你;如果你的转弯小于expr_tol,我就以为你只是在开车画龙而已,不是转弯、不入我法眼。
但是光有数值方面的限制还是不够的。我们前面说过,仿真器要处理的事情有两件,一件确实是数值,还有一件,那就是时间。如果不对采样间隔的时间进行限制,那么就可能出现一种情况,信号的数值在高速的变化,每次变化都很大,那么采样还是会搞出来好多数据,对仿真速度提升不高。所以time_tol这个参数也非常重要,一个信号,如果刚采样过你,你在小于time_tol的时间内,又变了好多,我是不采样的,只有过了time_tol再说。
总结下,就是首先呢,当信号在康庄大路行驶的时候,我的采样间距就是vdelta;但是如果信号要转弯、换方向了,那就得慢速下来小精度expr_tol了。另外每次采样是有时间间隔的,大于time_tol呢,我才可能干活,否则是我调整时间、坚决不工作。简单记住下面这个表格就OK了:
有了这个函数,就好办多了,只要总是 always monitor一个electrical信号,并且把它赋值给一个wreal信号,就顺利实现了E2R了:
always @(absdelta(V(w_electrical), vdelta, ttol, vtol))
W_wreal =V(w_electrical);
仿真器里面,它会把vdelta默认成电源的1/64;而vtol呢,是1/64的再1/4,即是vdelta的1/4。ttol默认是10ps,当然这些你都可以自己改。你可以自己在做model的时候,写上类似的代码,这时候就不是仿真器偷偷的、自动的给你加E2R了,而且你自己积极主动的掌控了这种E2R的节奏。例如,对于一些电平检测信号,以前传统做法就是直接0,1,但是这样子太粗糙了;这里你就可以把档期根据电平级别,设置成四五个不同级别;每个的vdelta并不需要像1/64那么大,或许只要1/20就足够了;ttol也是,直接设置到ns级就可以。但是比方说有一些信号,非常sensitive,你很关心它,那么你甚至可以设置成vdelta 1/128;保证你model里面用的足够精准(不过这显然损失了速度;记住,absdelta也是消耗仿真器的!永远的no pay,no gain)。
R2E & E2R 总结
把上文的E2R 和R2E connection module中最精华的code再简单总结如下表,方便快速查询:
好了,这就是集速度和精度于一身的wreal大才子,今天就介绍到这里了。熟悉了wreal,写model,保证精度的同时,让速度飞起来就不是梦了。
声明
本文归“模拟混合信号设计验证”公众号所有,转载请务必说明出处。多谢!
欢迎关注公众号“模拟混合信号设计验证”(yaliDV)来看图文并茂的文章。另外“IC咖啡学堂|模拟混合信号设计验证”微信群已经开启,目前已经超过100人,所以需要加入的话请联系t348841316以便邀请入群。