1.[UVM源代码研究] 如何定制一款个性化的码下打印格式
2.å¦ä½å®è£
rwordsegå·¥å
·å
3.Cè¯è¨ warning C4047: 'initializing' : 'int ' differs in levels of indirection from 'void *'ã
4.warning C4305: 'initializing' : truncation from 'const double' to 'float'是什么意思
[UVM源代码研究] 如何定制一款个性化的打印格式
使用默认的打印格式时,执行如下代码:
实际打印结果格式如下:
查看UVM源代码,码下我们首先定位`uvm_info宏定义的码下位置:
这段代码对uvm_info/uvm_warning/uvm_error/uvm_fatal等宏进行了描述,实际上是码下对uvm_report_*函数的封装。以`uvm_info为例,码下分析其执行过程,码下语音agc算法源码其中使用了全局函数uvm_report_enabled。码下
这里又调用了uvm_root中定义的码下uvm_report_enabled函数。需要注意的码下是,在uvm_root中并未找到这个函数的码下定义。经过查找源代码,码下发现uvm_report_object中定义了uvm_report_enabled。码下
为什么要通过uvm_root实例调用这个函数呢?这需要了解uvm类库的码下继承关系。通过分析,码下我们发现通过调用uvm_root中uvm_report_enabled的码下监测系统源码函数,是因为uvm_root支持单例模式,可以获取uvm_root的单例句柄执行uvm_report_object中定义的自动继承的函数,避免了创建额外的实例。
接下来分析函数执行过程,原本简单的获取severity对应的verbosity阈值设置,却涉及了severity的override问题。我们可以通过调用函数或运行时传入参数来对severity进行override。bbin 网站源码
所有severity的override都记录在uvm_pool键值对severity_id_verbosities中。
severity和verbosity枚举类型定义如下:
回到uvm_report_object中行的代码,可以认为调用`uvm宏传入的verbosity值如果大于设置的verbosity阈值,则uvm_report_enabled返回0。另外行还有一种函数返回0的情况。
关于uvm_action和verbosity的设置类似,不再展开。unity魔方源码执行`uvm_info系列宏时,不仅需要考虑severity对应的verbosity_level的设置是否大于阈值,还需要考虑对severity设置的行为是否为UVM_NO_ACTION来判断uvm_report_enabled的返回值。
本质上,执行的是uvm_report_server中的compose_message函数,该函数规定了uvm_info系列宏的打印格式。
这个函数的单独麻将源码参数filename和line是我们调用uvm_report_info传入的`uvm_file和`uvm_line。
`__FILE__和`__LINE__是systemverilog的编译指令,在编译阶段被替换:`__FILE__被替换为当前文件的文件名,以字符串形式存在;`__LINE__被替换为当前文件的行号,以十进制数字形式存在。
如果需要定义个性化的打印格式,可以通过从uvm_report_server继承一个类重写compose_message函数实现。需要注意的是,这里不能用set_type_override_by_type/name,因为uvm_report_server类没有使用uvm_object_utils注册,也没有实现get_type()函数,所以不能用传统的factory的override方法进行override。好在uvm_report_server已经预留好了子类server的覆盖函数set_server。
这个静态函数可以直接使用类uvm_report_server进行调用。接下来,我们通过一个例子来看看如何实现个性化打印的定制。
首先,我们定制自己的report_server:
然后,在base_test中实例化并set_server:
现在,我们来看看最初那句打印的执行情况:
通过以上步骤,我们便实现了个性化的打印定制,该定制对4种severity同时生效。
å¦ä½å®è£ rwordsegå·¥å ·å
å®è£ rwordsegå·¥å ·å æ¹å¼ï¼
ãã1ãrJavaå¨å®è£ åé¤äºå¯¹pathé ç½®æ£ç¡®å¤ï¼è¿æ个容æ忽ç¥çç»èï¼å³Rçæ¬çéæ©ï¼å¦æJREæ¯ä½çï¼é£ä¹Rä¹åºè¯¥è¦ä½ççæ¬ï¼å¦åè¯å®ä¼æ¥éãå¦ææ¯å¨Rstudioä¸å¯å¨Rï¼é£ä¹è¦æ£æ¥ä¸å¯å¨çRççæ¬æ¯åªä¸ªï¼æ¹æ³æ¯çTools-Global optionçé»è®¤é¡¹ã
ãã2ãRwordsegæ¾å¨RforgeèéCRANä¸ï¼å æ¤å¦æç´æ¥install.packagesï¼åºæ¬é½ä¼å¤±è´¥åç»ãæ£ç¡®æ¹æ³æ¯ä¸è½½æºç ï¼æ¬å°å®è£ ï¼èä¸æç ´ä¸ä¸ªä¼ è¨ï¼å³Rwordsegåªè½å¨R3.0.2çæ¬ä¸å®è£ æåï¼å®é ä¸ï¼å¦ææ¬å°å®è£ çåï¼R 3.1.0ä¹å¯ä»¥å®è£ æåã
ãã3. å°è¯å»ä¸è½½æºç ï¼æ¬å°å®è£
4. å¨RStudioæè RConsoleéé¢ï¼éç¨tar.gz/zipçæ¹å¼æ¬å°å®è£
Cè¯è¨ warning C: 'initializing' : 'int ' differs in levels of indirection from 'void *'ã
没æ代ç ä¸å¥½è¯´ï¼é常æ¯ç±äºå¨å½æ°è°ç¨æ¶çæ个åæ°éè¦void*æéï¼ä½ç¨åºè°ç¨æ¶å´ä½¿ç¨äºintåç表达å¼å¼èµ·çã
warning C: 'initializing' : truncation from 'const double' to 'float'是什么意思
你在试图把一个const double转成float
错误不是double不能转成float
而是你转了以后这个变量就不是const,这样就可以被修改了
编译器是不可能允许这种情况出现的
所以你要么去掉那个const的定义,要么在你的float前加个const
orz,我没看前面的,因为通常情况下只有人问error的,没想到LZ居然是在问warning
因为很早开始就不在意warning了,反正现在已经很明确自己在做什么
顺便, _鈊_烦_薏乱你的说法应该也是不对的吧?
初始化的时候应该不会报这个warning的
这个warning的产生在于pi*r*r
这个东西返回是个double,而area是float,可能产生结果过大,float无法表示的情况
所以建议LZ把area定义为double
当然,如果LZ确定你算的面积float可以表示的话,那么就不需要用double