我有一个verilog模块的串行输出,我想使用system-verilog进行测试。
在给定正确的串行输入'SI‘的情况下,名为'SO’的输出将输出类似8'hC6的内容,值为8'h9A。
有没有一种简单的方法来编码/解码串行Is,而无需明确描述每个信号?
例如:
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但显然这是行不通的。任何建议或例子都是非常受欢迎的。提前谢谢。
发布于 2013-06-12 01:30:27
尝试一个序列并参考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发布于 2013-06-11 23:13:12
您通常不使用断言来描述对数据项的检查,而是使用对控制信号的检查。在这种情况下,您需要将整个输入流收集到一个16位向量中,收集整个输出流,并检查您在SO行上获得的内容是否与您应该获得的内容相匹配( SI行上的内容的一些转换)。
我的SystemVerilog已经生疏了,但我会给你一个简单的例子来说明我的意思。注意,它是不可编译的。
// collect input
always @(posedge clk) begin
if en == 1 begin
collect_input();
end
end
logic[7:0] si;
task collect_input();
for i from 0 to 7 begin
si[i] = SI; // take care of endianness here, might be si[7-i];
end
endtask
// collect output
...
logic[7:0] so;
...
collect_output();
for ...
// after collecting so, check that it's correct
if so != transform(si) begin
$error("wrong output data");
end
endtask希望它能给你一个想法。
https://stackoverflow.com/questions/17037889
复制相似问题