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

标签 testing verilog system-verilog verification 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;

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

8'h9A ##[1:3] 8'hC6

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

最佳答案

尝试一个序列并引用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) );

这相当于提供的断言,更具可读性。

请注意 local 关键字,它将 expected 视为变量而不是引用,并允许您传递常量(例如 8'h9A, 8'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

关于testing - 使用 System-Verilog 进行串行测试台架和断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17037889/

相关文章:

java - Java 敏捷集成测试 DAO -> 数据库的最佳实践是什么?

python - 模拟丢失的包进行测试?

python - 如何在测试期间禁用 try/except block ?

Verilog 案例陈述

Verilog 中的字符串操作

database - "Unit"测试数据库

Verilog reg 分配给另一个reg 的一部分

system-verilog - 连接分层模块 : struct vs interface in SystemVerilog

verilog - 总是阻止@posege时钟

verilog - 在 systemverilog 的模块中使用结构数据类型