AXI strob size addr的关联+类约束中只生效某个变量的随机+verdi多次跳过断点+ral寄存器模型并发sequence+function中的变量随机化结果为0+process不适合在module中使用+linux的maps解析+vlogan的缺陷+ASID软件拓展

AXI strob size addr的关联

想要给0x00018地址写32位数据a,则需要发送awaddr 0x00018, awsize 32bit,wstrob 0xf00;
而不是发送awaddr 0x00010, awsize 32bit,wstrob 0xf00,此时由于 awsize 32bit,wstrob的值被固定在0x00-0x0f之间,发送失败。

awsize信号根据awaddr的地址,获取要读取的位置
wstrob信号根据awaddr、awsize获取偏移信息,和大小

AXI的awsize和wstrob的关系是基本没有关系。一般要求wstrob指示的宽度小于等于awsize。
awsize用于指定burst场景下每拍地址的自增宽度,指示可写的地址范围
wstrob用于指示每拍下的数据写入的宽度和位置

类约束中只生效某个变量的随机

下述约束中,当只生效x的时候,其它变量如y,被当做非随机变量,y如果出现在constraint块中,无法被约束;

class CA;
    rand byte x, y;
    byte v, w;
    constraint c1 { x < v && y > w );
endclass

CA a = new;
a.randomize();
// random variables: x, y state variables: v, w 
a.randomize( x );
// random variables: x state variables: y, v, w
a.randomize( v, w );
// random variables: v, w state variables: x, y
a.randomize( w, x );
// random variables: w, x state variables: y, v

verdi多次跳过断点

https://blog.csdn.net/asty9000/article/details/90603692
verdi在可视化的时候可以输入tcl命令,使用以下命令,多次执行即可

set x 0
while {$x<5} {
    puts $x;
    incr x;
}

ral寄存器模型并发sequence

并行的时候内部不一定是完全的顺序读取,前后的sequence需要控制

function中的变量随机化结果为0

当function和class中存在一个相同的变量,在function中对该变量进行随机,实际上拿取的是class中的值做的随机,使用function的值作为的结果

因此,如果需要function中的变量能够随机成功,需要确认class没有相同的变量。

process不适合在module中使用

如下代码中,如果使用process,则打印全部信息,如果使用disable,则正常退出没有打印信息。

// Code your testbench here
// or browse Examples
module test;
initial begin
  process p;
    fork : test_fork
        p = process::self();
        // 子进程1
        begin
            #10;
            // 终止当前进程
            $display("Process 1 finished");
        		p.kill();
            disable test_fork;
        end
        // 子进程2
        begin
            #20;
            $display("Process 2 finished");
        end
    join_any
    // 等待所有子进程完成
end
  
endmodule

linux的maps解析

查看maps的方法可以通过/proc/pid/maps查看总信息,也可以通过/proc/pid/smaps查看详细信息。
https://www.cnblogs.com/jiayy/p/3458076.html
想要知道这些log里的信息是什么,通过linux源码查看如何创建这些文件即可知道对应的字段。

00400000-0040b000 r-xp 00000000 fd:00 48              /mnt/cf/orig/root/bin/cat
0060a000-0060b000 r--p 0000a000 fd:00 48              /mnt/cf/orig/root/bin/cat
0060b000-0060c000 rw-p 0000b000 fd:00 48              /mnt/cf/orig/root/bin/cat 代码段
0060c000-0062d000 rw-p 00000000 00:00 0               [heap] 堆区
7f1fff43b000-7f1fff5d4000 r-xp 00000000 fd:00 861   /mnt/cf/orig/root/lib64/libc-2.15.so
7f1fff5d4000-7f1fff7d3000 ---p 00199000 fd:00 861  /mnt/cf/orig/root/lib64/libc-2.15.so
7f1fff7d3000-7f1fff7d7000 r--p 00198000 fd:00 861   /mnt/cf/orig/root/lib64/libc-2.15.so
7f1fff7d7000-7f1fff7d9000 rw-p 0019c000 fd:00 861   /mnt/cf/orig/root/lib64/libc-2.15.so
    //首先打印maps里面前5项数据,起止地址、属性、偏移地址、主从设备号、inode编号。
    seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu ",
            start,
            end,
            flags & VM_READ ? 'r' : '-',
            flags & VM_WRITE ? 'w' : '-',
            flags & VM_EXEC ? 'x' : '-',
            flags & VM_MAYSHARE ? 's' : 'p',
            pgoff,
            MAJOR(dev), MINOR(dev), ino);
    
    // 如果是个文件,那么打印文件完整路径。        
    if (file) {
        seq_pad(m, ' ');
        seq_file_path(m, file, "\n");
        goto done;
    }
    
    name = arch_vma_name(vma);
    if (!name) {
        // vDSO是系统调用相关,详细信息见vDSO。
        if (!mm) {
            name = "[vdso]";
            goto done;
        }
        // 满足start_brk <= vma <= brk,则其vma是[heap]。
        if (vma->vm_start <= mm->brk &&
            vma->vm_end >= mm->start_brk) {
            name = "[heap]";
            goto done;
        }
        // 满足vma包含所在地址空间的start_stack地址,则vma是[stack]。
        if (is_stack(priv, vma))
            name = "[stack]";
    }

done:
    if (name) {
        seq_pad(m, ' ');
        seq_puts(m, name);
    }
    seq_putc(m, '\n');



static int is_stack(struct proc_maps_private *priv,
            struct vm_area_struct *vma)
{
    // 判断一个vma是否属于stack,只需要判断start_stack是否在其区域内。
    return vma->vm_start <= vma->vm_mm->start_stack &&
        vma->vm_end >= vma->vm_mm->start_stack;
}

vlogan的缺陷

使用vlogan读取其它的package的时候,带有-f和不带-f的区别很大。
不带-f情况下,当前package引用其它的package时候不需要include,否则当前package引用其它的package仍需include之前的package,以引用之前的package。

这种现象本质是因为带有-f的情况下,可能存在一些读取的优化过程,即可能不被使用的文件将不会被读取,而不带-f的文件,则一定是被读取的文件。
这种现象在结果上会导致vcs的三步法编译稍微快于2步法,因为3步法可能优化掉读取的文件,而两步法是读取了所有文件。

在有些时候为了防止被读取优化,需要声明顶层的module,或将关联性最强的文件提取出来,引导vlogan工具对其顶层所需要的文件进行读取。

ASID软件拓展

ASID超出的部分,是通过generation变量控制,硬件支持的个数被软件拓展
http://www.wowotech.net/process_management/context-switch-tlb.html

posted @ 2025-04-05 14:30  大浪淘沙、  阅读(58)  评论(0)    收藏  举报