日常记录(61)全视界-SV2

这本书的整体结构也只能将就看看,无论是从代码缩进还是语句,整体行文逻辑实在是有点混乱。另外一些代码无法编译通过,或者给出了错误的结论(vcs2016)

比较器的验证计划

异常检查:如复位,等异常

常规检查:数据完整性,功能配置

时序检查:时序是否符合预期

 

package的语法注意

1. 优先使用内部的类实例化

package被import后(且使用import pkg::*),如果内部有同样的类名定义,则优先使用内部的类实例化。

package a_pkg;
    class mon;
        static function void display1();
            $info("this is a package class");
        endfunction: display1
    endclass
endpackage

module module1;
    class mon;
        static function void display1();
            $info("this is a module class");
        endfunction: display1
    endclass

    import a_pkg::*;
    mon mon1 = new();
    initial begin
        mon::display1();
    end
endmodule

如下输出为

Info: "module1.sv", 13: module1: at time 0
this is a module class

2. 同名冲突错误

package被import后(且使用import pkg::class_name),如何内部有相同的class_name,则发生冲突错误。

import改为:
import a_pkg::mon;

3. 使用export 

package嵌套后,被嵌套的package不可见,需要使用export方式。

mon2不可见,报错。

package b_pkg;
    class b_mon;
    endclass
endpackage

package a_pkg;
    import b_pkg::b_mon;
    class a_mon;
    endclass
endpackage

module module1;
    import a_pkg::*;
    a_mon mon1 = new();
    b_mon mon2 = new();
endmodule

使用export

查看代码

package b_pkg;
    class b_mon;
    endclass
endpackage

package a_pkg;
    import b_pkg::b_mon;
    export b_pkg::b_mon;
    class a_mon;
    endclass
endpackage

module module1;
    import a_pkg::*;
    a_mon mon1 = new();
    b_mon mon2 = new();
endmodule

4. 系统默认

系统默认的randomize是在std包中。

 

process控制下的线程并发

常用方法有:状态:status,挂起suspend,恢复resume等。

`timescale 1ns/1ns
module proc_case1;
    process p1;
    process p2;

    task t1();
        p1 = process::self();
        $display("@%0t t1 started", $time);
        #15ns;
        $display("@%0t t1 running", $time);
        #15ns;
        $display("@%0t t1 finished", $time);
    endtask

    task t2();
        p2 = process::self();
        $display("@%0t t2 started", $time);
        #20ns;
        $display("@%0t t2 finished", $time);
    endtask

    initial begin
        fork: thread_trigger
            t1();
            t2();
        join_none

        fork
            begin
                #5ns; 
                p1.suspend();
                $display("@%0t t1 state is %s", $time, p1.status());
            end
            begin
                #5ns; 
                p2.kill();
                $display("@%0t t2 state is %s", $time, p2.status());
            end
        join
        #20ns;
        p1.resume();
    end
endmodule

vcs下的输出结果。

t1走了5ns以后,就停住了,恢复时候仍然继续延时剩下的10ns,打印running。

@0 t1 started
@0 t2 started
@5 t1 state is SUSPENDED
@5 t2 state is KILLED
@35 t1 running
@50 t1 finished

 

posted @ 2022-02-22 16:31  大浪淘沙、  阅读(56)  评论(0)    收藏  举报