1. 程式人生 > 其它 >日常記錄(86)UART初步等細節

日常記錄(86)UART初步等細節

UART的RTL連線

左端的uart16550為需要驗的模組

驗證收集內容

https://gitee.com/bai-mengwei/my_uart_tb
LCR:控制讀寫格式的
MCR:調製解調控制暫存器
MSR:調製解調狀態暫存器
斷言:驗證apb協議

onehot0

onehot0表示沒有高(全為0),則仍然可以斷言成功

可以用在檢查片選訊號上(片選訊號每次最多選一個,可以不選)

binsof(x) intersect(y)

bins的選擇條件
x的內容中,包括y的部分

如下示例

$stable

是上升沿||下降沿的一種取反。

在判定的時候,不穩定是指代前一個狀態發生

module taa ();
    logic a;
    logic [2:0] b;
    logic c;

    initial begin
        a = 0;
        forever begin
            #10 a = ~a;
        end
    end

    initial begin
        b = 3'b0;
        forever begin
            #20 b = b + 1;
        end
    end

    initial begin
        c = 0;
        forever begin
            #5 c = ~c;
        end
    end

    property STABLE_TEST;
        @(posedge a)
        (!$stable(b) && $onehot(b)) |=> c;
    endproperty
    MY_ASSERT: assert property(STABLE_TEST);

    initial begin
        #100000;
        $finish;
    end
endmodule
test: taa wave
taa:
	vcs -full64 -sverilog -R -debug_access+all +vcs+vcdpluson taa.sv
debug:
	./simv -gui &
wave:
	dve -vpd vcdplus.vpd &

fork-join_none在task外的執行

module taa ();
    task task1();
        fork
            #10;
            $display("after 10 time");
        join_none
    endtask: task1

    task task2();
        fork
            #10;
            $display("after 10 time");
        join
    endtask: task2

    task task3();
        begin
            #10;
            $display("after 10 time");
        end
    endtask: task3

    initial begin
        $display("before");
        task1();
        #10;
        $display("task 1:fork join_none %t", $realtime);
        task2();
        #10;
        $display("task 2 %t fork join", $realtime);
        task3();
        #10;
        $display("task 3 %t begin end", $realtime);
        $finish;
    end
endmodule
taa:
	vcs -full64 -sverilog -R -debug_access+a taa.sv

輸出

before
after 10 time
task 1:fork join_none                   10
after 10 time
task 2                   30 fork join
after 10 time
task 3                   50 begin end
$finish called from file "taa.sv", line 34.
$finish at simulation time                   50

非連續跟隨重複符

連續重複運算子

非連續重複操作符

uvm_reg_predictor

如果使用映象值獲取資料(在function中使用),則必須定義uvm_reg_predictor並連線(bus_in)


例子

自定義概率生成資料的randcase

module taa ();
    initial begin
        int x;
        for (int i = 0; i < 10; i++) begin
            randcase
                1:x=1;
                2:x=2;
                3:x=3;
            endcase
            $display("x is %0d", x);
        end
    end
endmodule
taa:
	vcs -sverilog -R taa.sv

輸出資料

x is 2
x is 3
x is 1
x is 3
x is 3
x is 3
x is 2
x is 1
x is 2
x is 3