日常記錄(86)UART初步等細節
阿新 • • 發佈:2022-06-05
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