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
Le vent se lève! . . . il faut tenter de vivre!
Le vent se lève! . . . il faut tenter de vivre!

浙公网安备 33010602011771号