gpt4 book ai didi

verilog - 在递归属性中使用队列

转载 作者:行者123 更新时间:2023-12-04 21:44:14 26 4
gpt4 key购买 nike

我有一些来自 1 位串行端口的数据,这些数据来自多个字节的变体长度,例如:

byte expected_1 [$] = {8'hBA, 8'hDD, 8'hC0, 8'hDE};
byte expected_2 [$] = {8'h01, 8'h23, 8'h45, 8'h67, 8'h89, 8'hAB, 8'hCD, 8'hEF};

在每个正时钟沿,发送一位。我需要测试数百个序列(将来可能有数千个),所以我想在系统 verilog 中使用断言自动化该过程。新的 2012 标准允许将队列传递给属性,但是可以通过递归属性发送队列吗?我收到了一些关于分层引用的错误。

这是我到目前为止所拥有的(在@Greg here 的帮助下):
default clocking sck @(posedge sck); endclocking : sck  

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

property recurring_queue(bit en, logic data, byte data_e [$])
int queue_size = data_e.size;
logic [7:0] expected = data_e.pop_front();

if(queue_size != 0) (
!en throughout (seq_serial(data, expected) ##1 recurring_queue(en, data, data_e))
);

endproperty : recurring_queue

`define ez_assert(exp)
assert property (recurring_queue(en, data, exp))
else $error("Bad Sequence @ time: %t. Info: %m", $time);

在我的测试平台中调用断言应该像这样简单:
A1 : `ez_assert(expected_1);

错误消息如下:
1) passing hierarchical ref to be used in another hierarchical ref is not supported 
2) Illegal SVA property in RHS of'##' expression
3) Local variable queue_size referenced in expression before getting initialized

我对断言长可变长度串行序列的其他想法持开放态度。

最佳答案

尝试与 seq_serial 相同的策略:

sequence seq_queue_pattern(bit en, logic data, byte expt_queue [$]);
int qidx = 0;
( !en throughout (seq_serial(data,expt_queue[qidx]), qidx++)[*] )
##1 (qidx==expt_queue.size);
endsequence : seq_queue_pattern

asrt_expected_1 : assert property ( $fell(en) |-> seq_queue_pattern(en,data,expected_1));
asrt_expected_2 : assert property ( $fell(en) |-> seq_queue_pattern(en,data,expected_2));

如果 en 为高或 seq_serial,此断言将失败链与预期不符。 parent 的位置不重要吗:
  • en不在乎最后一个时钟 seq_serial完成:
  • ( !en throughout (seq_serial(data,expt_queue[qidx]), qidx++)[*] ) ##1 (qidx==expt_queue.size)
  • en最后一个时钟后必须为低 seq_serial完成或失败,之后不在乎
  • !en throughout ( (seq_serial(data,expt_queue[qidx]), qidx++)[*] ##1
    (qidx==expt_queue.size) )
  • en最后一个时钟后必须为低 seq_serial完成后不在乎
  • !en throughout ( (seq_serial(data,expt_queue[qidx]), qidx++)[*] ##1
    (qidx==expt_queue.size) ) ##1 (qidx==expt_queue.size)

  • 序列和属性中的队列是新的,可能尚未被所有模拟器完全支持。要解决此限制,请使用参数化宏为每个预期的队列流创建一个序列:
    `define asrt_qpat(en,monitor, expt_queue) \
    sequence seq_queue_pattern__``expt_queue (bit en, logic data); \
    int qidx = 0; \
    (!en throughout (seq_serial(data,expt_queue[qidx]), qidx++)[*]) \
    ##1 (qidx==expt_queue.size); \
    endsequence : seq_queue_pattern__``expt_queue \
    \
    asrt_``expt_queue : assert property( @(posedge clk) \
    $fell(en) |=> seq_queue_pattern__``expt_queue (en,monitor) ) \
    else $error("Bad Sequence @ time: %t. Info: %m", $time);

    `asrt_qpat(en,data[0],expected_1)
    `asrt_qpat(en,data[1],expected_2)

    关于verilog - 在递归属性中使用队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17138930/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com