Hence6349 3 February 8 Posted February 8 · Report post Здравствуйте. Наткнулся на то, что в xcelium 23 (и 24) отключение рандомизации для queue объектов не работает, как с другими типами. Вот пример: class object; local rand int a; function new(); a = 0; endfunction function void print(); $display("a = %0d", a); endfunction endclass typedef object object_q[$]; class rand_mode_test; rand local object_q objects; function new(); objects.rand_mode(0); endfunction function void pre_randomize(); initialize_objects(); endfunction local function void initialize_objects(); objects = {}; repeat(1) begin object temp = new(); objects.push_back(temp); end endfunction function void print(); foreach(objects[i]) begin objects[i].print(); end endfunction endclass module tb; initial begin main(); #1000ns; $finish; end task automatic main(); rand_mode_test test = new(); assert(test.randomize()); test.print(); endtask endmodule Я ожидаю, что после выполнения строчки test.print() - выведутся все 0, потому что рандомизация отключена, но выводятся явно рандомные значения. Запуск в xcelium 23 и 24 дает следующий результат: xmsim(64): 24.03-s001: (c) Copyright 1995-2024 Cadence Design Systems, Inc. Loading snapshot work.tb:module .................... Done SVSEED default: 1 xcelium> source /var/eda/cadence/XCELIUM2403/tools/methodology/UVM/CDNS-1.2/additions/sv/files/tcl/uvm_sim.tcl xcelium> run a = 1491695440 Simulation complete via $finish(1) at time 1 US + 0 То есть очевидно, что рандомизация не отключилась. В стандарте я не нашел, почему бы этот пример не должен работать, как я ожидаю. Quote Share this post Link to post Share on other sites More sharing options...
kirill70674 6 February 8 Posted February 8 · Report post Здравствуйте, Вот Ваш код с небольшими изменениями: Спойлер class object; local rand int a; function new(); a = 0; endfunction function void print(); $display("a = %0d", a); endfunction endclass typedef object object_q[$]; class rand_mode_test; rand local object_q objects; function new(); //objects.rand_mode(0); endfunction function void pre_randomize(); initialize_objects(); endfunction local function void initialize_objects(); objects = {}; repeat(1) begin object temp = new(); objects.push_back(temp); end objects.rand_mode(0); // !!! endfunction function void print(); foreach(objects[i]) begin objects[i].print(); end endfunction endclass module tb; initial begin main(); #1000ns; $finish; end task automatic main(); rand_mode_test test = new(); assert(test.randomize()); test.print(); endtask endmodule Выключение рандомизации после выделения памяти под целевые объекты приводит к искомому результату. Quote Share this post Link to post Share on other sites More sharing options...
Hence6349 3 February 8 Posted February 8 · Report post Спасибо. Но в процессе отладки примера выше, я хотел посмотреть, а какой rand_mode будет в итоге у поля objects в классе rand_mode_test. Когда я пытался вывести rand_mode, у меня случалась ошибка компиляции. Но я опять же не пойму почему, ведь очередь - это переменная, которая может быть объявлена с модификатором rand, то есть у нее должно быть можно посмотреть с помощью метода rand_mode(), в каком она сейчас состоянии (моде). Я пришел к более простому примеру, который у меня не компилируется. typedef int int_q[$]; class rand_mode_test; rand int_q data; constraint c_data_size { data.size() inside {[5 : 10]}; } function void pre_randomize(); $display("data.rand_mode() = %0b", data.rand_mode()); endfunction endclass module tb; initial begin main(); #1000ns; $finish; end task automatic main(); rand_mode_test test = new(); assert(test.randomize()); endtask endmodule xmvlog: *E,EXPRMS (/home/tsymbalenko-dn/playground/sim/tb/tb.sv,11|52): Expecting an array element as the prefix to a rand_mode function. Правильно ли я понимаю, что в xcelium просто нереализован этот функционал или я что-то неправильно делаю? Quote Share this post Link to post Share on other sites More sharing options...