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};
各正のクロック エッジで、1 ビットが送信されます。何百ものシーケンスをテストベンチする必要があるため (将来的には数千になる可能性があります)、システム 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
長い可変長シリアル シーケンスをアサートするための他のアイデアを受け入れます。