sv的LSB 使用+SV的protect类型+RAL模型的lock原因+C语言结构体中的冒号用法+uvm版本在退出机制的区别+sv的random的seed生效问题+verdi的reserve的debug+vcs禁用打印屏幕输出+清空seqr中的seq+sv使用process开启进程和结束

发布时间 2023-10-06 12:25:03作者: 大浪淘沙、

sv的LSB 使用

https://blog.csdn.net/gsjthxy/article/details/90722378
等价关系

[LSB+:STEP] = [LSB+STEP:LSB]

伪代码:

bit [1023:0] mem;
bit [7:0] data;
j = 0..100
mem[j*8 +: 8] = data;
// [7:0],[15:8], [23:16]

SV的protect类型

https://blog.csdn.net/qq_37573794/article/details/117530044
local — 限制只在本class中使用,子类以及外部类中不可调用
protected — 限制只在本class以及子类中使用,外部类不可调用

RAL模型的lock原因

https://blog.csdn.net/liuwei848/article/details/103576767
必须在root block中调用lock_model,这样整个模型才算建立完整,因为在建立模型的时候所有寄存器的地址均是相对地址,在进行前门访问,是以绝对地址进行的,因此lock_model帮助我们得到所有寄存器的绝对地址。
如下源码相关:

function void uvm_reg_block::Xinit_address_mapsX();
   foreach (maps[map_]) begin
      uvm_reg_map map = map_;
      map.Xinit_address_mapX();
   end
      //map.Xverify_map_configX();
endfunction

C语言结构体中的冒号用法

https://blog.csdn.net/yihongxiaoxiang/article/details/50327587

struct  bit_struct{
    int  bit1:3;
    int  bit2:5;
    int  bit3:7;
}data;

结构体成员变量后面的冒号表示位域,表示存储空间不需要完整的字节,只需要几个bit。

#include <stdio.h>
#define  SYS_OK         0
#define  SYS_FAILED     1
typedef int SYS_TYPE;

SYS_TYPE main()
{       
    struct bit_st
    {
        int a:3; 
        int  :0; 
      int b:2; 
      int c:5; 
      int d:2; 
      int  :2; 
      int e:3; 
    }data, *pData;

    data.a = 1;
    data.b = 2; 
    data.c = 3; 
    data.d = 2; 
    data.e = 4;
    printf("a = %d, b = %d, c = %d, d = %d, e = %d\r\n",
            data.a, data.b, data.c, data.d, data.e); 

    pData = &data;
    pData->a = 3;
    pData->b &= 1;
    pData->c |= 5;
    pData->d ^= 1;
    pData->e = 5;
    printf("a = %d, b = %d, c = %d, d = %d, e = %d\r\n",
            pData->a, pData->b, pData->c, pData->d, pData->e); 
		printf("sizeof data:%ld\n", sizeof(data));
    return SYS_OK;
}

int占32位,第二个成员 int :0是后面的3~31全为0。整个结构体占8个字节,也就是两个int型变量,而int :2; 是占用两个空的位置,两个bit。输出值是8。

   struct bit_st
    {
        int a:3; 
        int  :0; 
      long int b:2; 
      long int c:5; 
      long int d:2; 
      long int:30; 
      long int e:3; 
    }data, *pData;

以上的sizeof大小是16。

uvm版本在退出机制的区别

//uvm1.1
component里直接调用
set_report_max_quit_count(8);

// uvm1.2
uvm_report_server server = uvm_report_server::set_server()
server.set_max_quit_count(8);

sv的random的seed生效问题

http://ee.mweda.com/ask/342266.html

1、随机系统函数包括$random(seed), $urandom(seed), $urandom_range(min,max), 
$srandom(seed),其中$random(seed)是verilog2001的语法,后面3个是sv的语法。
2、$random与$urandom除了有无符号的区别还有其他不同。sv语法中有提到线程稳定性的区别。
3、$random如果不带种子会使用系统缺省的种子产生随机数,这可能是每次不变的原因,
你带上种子参数试试看是是否改变。
4、$urandom不带种子也可以随机,我猜测可能是因为verilog与sv对其处理机制不一样,
且也不能排除不同编译仿真器对其理解的不同而导致的。
● testbench的 +ntb_random_seed 变量相关。这个option的值相当于所有random var的种子,
控制了$urandom的随机。
● $random必须通过$random(seed)的方式指定seed,seed不同则得到的随机数不同。
使用simv+ntb_random_seed_automatic没有效果。
● $urandom可以通过$urandom(seed)的方式指定seed,此时:
simv+ntb_random_seed_automatic不起作用。
● $urandom也可以不指定seed,通过simv+ntb_random_seed_automatic得到随机的seed值,
此时也可以得到随机数。
● 没有+ntb_random_seed_automatic选项,则默认seed为1,$urandom也拿到相同的值

verdi的reserve的debug

reverse的debug似乎是不能将波形也reverse掉。
reserve需要额外的编译选项,然后在打开verdi后,tools/perxxx,勾上reverse的开关。
https://zhuanlan.zhihu.com/p/401940992

deubg_access+reverse

vcs禁用打印屏幕输出

仿真时候的选项,加上以后log就只打印在-l指定的文件中。但是该选项使用后,仿真使用的-gui/-verdi调试功能将会受限,认为vcs版本小于2012

+vcs+nostdout

清空seqr中的seq

当seq.start()已经调用,但是被kill掉,seqr需要清空。
https://blog.csdn.net/lbt_dvshare/article/details/80594234

seqr.stop_sequences();

sv使用process开启进程和结束

initial begin
  	process proc

  	fork
      	begin
          	proc = process::self();
          	xxxx_run();
				end
  	join_none

  	#5;
  	proc.kill();

end