使用System-Verilog进行串行测试和断言

N8T*_*TRO 3 testing verification verilog system-verilog system-verilog-assertions

我有一个verilog模块的串行输出,我想使用system-verilog进行测试。

给定正确的串行输入“ SI”(其值为8'h9A),称为“ SO”的输出将输出类似于8'hC6的输出。

是否有一种无需明确描述每个信号的简单方法来编码/解码串行IO?

例如:

assert property @(posedge clk) $rose(EN) |-> ##[1:3] SI ##1 !SI[*2] ##1 SI[*2] ##1 !SI ##1 SI ##1 !SI
                                             ##[1:3] SO[*2] ##1 !SO[*3] ##1 SO[*2] ##1 !SO;
Run Code Online (Sandbox Code Playgroud)

它看起来像一团混乱,几乎不可读。我非常想写

8'h9A ##[1:3] 8'hC6
Run Code Online (Sandbox Code Playgroud)

但显然这是行不通的。任何建议或示例都将受到欢迎。提前致谢。

Gre*_*reg 5

尝试序列并参考IEEE Std 1800-2012第16.10节(局部变量):

sequence seq_serial(logic signal, local logic [7:0] expected);
    byte idx = 7;
    (signal == expected[idx], idx--)[*8];
endsequence : seq_serial

asrt_si0x9A_so0xC6 : assert property ( @(posedge clk)
    $rose(EN) |-> ##[1:3] seq_serial(SI, 8'h9A) ##[1:3] seq_serial(SO, 8'hC6) );
Run Code Online (Sandbox Code Playgroud)

这等效于所提供的断言,并且更具可读性。

确实注意到了local这将把关键词expected作为一个变量而不是一个引用,并允许您通过恒定(例如8'h9A8'hC6),仍然可以让你考绩网引用。有关更多信息,请参见IEEE Std 1800-2012第16.8.2节(序列声明中的局部变量形式参数)。

这是证明该断言的简单测试平台。我开车SO是因为我没有真正的DUT,我想演示通过和失败的情况。

bit EN, clk;
logic SI,SO;
logic [7:0] si_var, so_var;
initial forever #10ns clk++; // clock generator
default clocking cb @(posedge clk); output #1ns EN,SI,SO; endclocking : cb
initial begin : test_vector
    si_var = 8'h9A;
    so_var = 8'hC6;
    ##1 cb.EN <= 1;
    ##($urandom_range(2,0)); // rand delay
    foreach(si_var[i]) ##1 cb.SI <= si_var[i];
    ##($urandom_range(2,0)); // rand delay
    foreach(so_var[i]) ##1 cb.SO <= so_var[i];
    ##1 cb.EN <= 0;

    /* Now make the assertion fail */
    so_var = 8'hC7; // make fail
    ##3 cb.EN <= 1;
    ##($urandom_range(2,0)); // rand delay
    foreach(si_var[i]) ##1 cb.SI <= si_var[i];
    ##($urandom_range(2,0)); // rand delay
    foreach(so_var[i]) ##1 cb.SO <= so_var[i];
    ##1 cb.EN <= 0;

    #10ns; // little delay before finish
    $finish(2);
end : test_vector
Run Code Online (Sandbox Code Playgroud)