Lutovid 0 30 ноября, 2019 Опубликовано 30 ноября, 2019 · Жалоба Привет всем! Осваиваю новые конструкции языка и столкнулся с проблемой Написал Вот такой блок симуляции Spoiler `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 11/16/2019 01:40:03 PM // Design Name: // Module Name: TestBench // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// import gmii_router_definitions::*; //clock generation class class clkParameters; int period = 8; rand int clk_pahse_delay [3:0]; constraint phase_values { foreach (clk_pahse_delay[i]) { clk_pahse_delay[i]<period && clk_pahse_delay[i]>=0;}} endclass : clkParameters //frame generation class and package package frameTypePKG; typedef enum {BROADCAST_P=0, UNICAST_P=1} frameType; endpackage import frameTypePKG::*; class frameParameters; typedef enum {BROADCAST_P=0, UNICAST_P=1} frameType; rand logic shrinked_preamble; rand int frame_length; rand frameType frame_type; constraint frame_length_constr {frame_length inside {[64:1500]};} constraint frameTypeConstr { frame_type dist { BROADCAST_P := 2, UNICAST_P := 8 }; } endclass : frameParameters //gmii interface interface gmii_interface_io (); logic [7:0] rxd; logic rx_dv; logic rx_err; logic [7:0] txd; logic tx_en; logic tx_err; modport master (input rxd, input rx_dv, input rx_err, output txd, output tx_en, output tx_err); modport slave (output rxd, output rx_dv, output rx_err, input txd, input tx_en, input tx_err); endinterface: gmii_interface_io // //switch inner interfaces(generate acks on rxd lanes) // interface gmii_interface_io_inner (input clk2, input clk3, gmii_interface_io.slave port2, gmii_interface_io.slave port3); // logic [47:0] port2_device_MAC = 48'h22AABBCCDDAA; // logic [47:0] port3_device_MAC = 48'h33AABBCCDDAA; // // modport sendData(import send_frame); // // task send_frame(int data_size); // // endtask : send_frame // endinterface: gmii_interface_io_inner //switch inner interfaces(generate data on txd lanes) interface gmii_interface_io_outer (input clk, gmii_interface_io.master port); modport sendData(import send_rx_frame); task send_rx_frame(input logic [47:0] MAC_SRC_VAL, input logic [47:0] MAC_DST_VAL); frameParameters fT = new(); fT.randomize(); $display("Shrinked = %d, Size = %d", fT.shrinked_preamble, fT.frame_length); port.rx_dv = 0; port.rx_err = 0; port.rxd = 8'h00; for(int i=0;i<12;i++)begin : send_interframe @(posedge clk); port.rx_dv = 0; port.rx_err = 0; port.rxd = 8'h55; end for(int i=0;i<(6+fT.shrinked_preamble);i++)begin : send_preamble @(posedge clk); port.rx_dv = 1; port.rx_err = 0; port.rxd = 8'h55; end @(posedge clk);//end of preamble port.rx_dv = 1; port.rx_err = 0; port.rxd = 8'hD5; for(int i=0;i<6;i++)begin : send_MAC_dst @(posedge clk); port.rx_dv = 1; port.rx_err = 0; if (fT.frame_type==BROADCAST_P) begin port.rxd = 8'hFF; end else begin port.rxd = MAC_DST_VAL[i*8+:8]; end end for(int i=0;i<6;i++)begin : send_MAC_src @(posedge clk); port.rx_dv = 1; port.rx_err = 0; port.rxd = MAC_SRC_VAL[i*8+:8]; end for(int i=0;i<fT.frame_length;i++)begin : send_payload @(posedge clk); port.rx_dv = 1; port.rx_err = 0; port.rxd = $urandom(); end @(posedge clk);//end of packet port.rx_dv = 0; port.rx_err = 0; port.rxd = 8'h55; endtask : send_rx_frame endinterface: gmii_interface_io_outer module TestBench( ); //clock generation logic sys_clk, clk[3:0]; clkParameters clk_param = new(); event sys_clk_start, clk_start; logic [3:0] clk_start_trg; initial begin assert (clk_param.randomize()) else $error("rand didn't work"); $display("Phase delays:%p",clk_param.clk_pahse_delay); #10->clk_start; end initial begin sys_clk = 1'b0; @clk_start;//wait phase initialize forever begin sys_clk = #(clk_param.period/2) ~sys_clk; end end initial begin clk_start_trg=0; @clk_start;//wait phase initialize fork for (int i = 0; i < 4; i++) begin clk_start_trg[i] = #(clk_param.clk_pahse_delay[i]) 1'b1; end join end genvar clk_inst; generate for (clk_inst=0; clk_inst < 4; clk_inst++) begin: clock_distrib always begin if (clk_start_trg[clk_inst]) begin clk[clk_inst] = 1'b0; #(clk_param.period/2) clk[clk_inst] = 1'b1; #(clk_param.period/2); end else #1 clk[clk_inst] = 1'b0;; end end endgenerate //dut instantiating gmii_interface_io gmii_interface_io_port0(); gmii_interface_io gmii_interface_io_port1(); gmii_interface_io gmii_interface_io_port2(); gmii_interface_io gmii_interface_io_port3(); gmii_interface_io_outer gmii_flow_0(clk[0], gmii_interface_io_port0); gmii_interface_io_outer gmii_flow_1(clk[1], gmii_interface_io_port1); initial begin : sender_0 @clk_start;//wait phase initialize gmii_flow_0.sendData.send_rx_frame(20,40); end // initial begin : sender_1 // @clk_start;//wait phase initialize // gmii_flow_1.sendData.send_rx_frame(20,40); // end gmii_switch_2x2 dut ( .arp_table_clk(sys_clk), .clk_port0(clk[0]), .clk_port1(clk[1]), .clk_port2(clk[2]), .clk_port3(clk[3]), .rst(1'b0), .gmii_rxd_0 (), .gmii_rx_dv_0 (), .gmii_rx_err_0(), .gmii_txd_0 (), .gmii_tx_dv_0 (), .gmii_tx_err_0(), .gmii_rxd_1 (), .gmii_rx_dv_1 (), .gmii_rx_err_1(), .gmii_txd_1 (), .gmii_tx_dv_1 (), .gmii_tx_err_1(), .gmii_rxd_2 (), .gmii_rx_dv_2 (), .gmii_rx_err_2(), .gmii_txd_2 (), .gmii_tx_dv_2 (), .gmii_tx_err_2(), .gmii_rxd_3 (), .gmii_rx_dv_3 (), .gmii_rx_err_3(), .gmii_txd_3 (), .gmii_tx_dv_3 (), .gmii_tx_err_3() ); endmodule : TestBench Если в нем закомментить строку gmii_interface_io_outer gmii_flow_1(clk[1], gmii_interface_io_port1); То симуляция стартует без ошибок, при том, что строка gmii_interface_io_outer gmii_flow_0(clk[0], gmii_interface_io_port0); останется Но если присутствуют обе эти строки, то появляется ошибка: INFO: [Vivado 12-4795] Using compiled simulation libraries for IPs INFO: [SIM-utils-51] Simulation object is 'sim_1' INFO: [USF-XSim-7] Finding pre-compiled libraries... INFO: [USF-XSim-11] File '/home/xakstreet/XilinxDistr/Vivado/2017.1/data/xsim/ip/xsim_ip.ini' copied to run dir:'/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/xproject/gmii_switch.sim/sim_1/behav' INFO: [SIM-utils-54] Inspecting design source files for 'TestBench' in fileset 'sim_1'... INFO: [USF-XSim-97] Finding global include files... INFO: [USF-XSim-98] Fetching design files from 'sim_1'... INFO: [USF-XSim-2] XSim::Compile design INFO: [USF-XSim-61] Executing 'COMPILE and ANALYZE' step in '/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/xproject/gmii_switch.sim/sim_1/behav' xvlog -m64 --relax -L xil_defaultlib -prj TestBench_vlog.prj INFO: [VRFC 10-2263] Analyzing Verilog file "/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/src/ip/data_combiner_fifo/sim/data_combiner_fifo.v" into library xil_defaultlib INFO: [VRFC 10-311] analyzing module data_combiner_fifo INFO: [VRFC 10-2263] Analyzing Verilog file "/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/src/ip/mac_info_clock_converter/sim/mac_info_clock_converter.v" into library xil_defaultlib INFO: [VRFC 10-311] analyzing module mac_info_clock_converter INFO: [VRFC 10-2263] Analyzing SystemVerilog file "/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/src/rtl/gmii_router_definitions.sv" into library xil_defaultlib INFO: [VRFC 10-2263] Analyzing SystemVerilog file "/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/src/rtl/MAC_table_writer.sv" into library xil_defaultlib INFO: [VRFC 10-311] analyzing module MAC_table_writer INFO: [VRFC 10-2263] Analyzing SystemVerilog file "/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/src/rtl/gmii_data_combiner.sv" into library xil_defaultlib INFO: [VRFC 10-311] analyzing module gmii_data_combiner INFO: [VRFC 10-2263] Analyzing SystemVerilog file "/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/src/rtl/gmii_router.sv" into library xil_defaultlib INFO: [VRFC 10-311] analyzing module gmii_router INFO: [VRFC 10-2263] Analyzing SystemVerilog file "/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/src/rtl/gmii_switch.sv" into library xil_defaultlib INFO: [VRFC 10-311] analyzing module gmii_switch_2x2 INFO: [VRFC 10-2263] Analyzing SystemVerilog file "/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/src/rtl/mac_source_parser.sv" into library xil_defaultlib INFO: [VRFC 10-311] analyzing module mac_source_parser INFO: [VRFC 10-2263] Analyzing SystemVerilog file "/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/src/rtl/TestBench.sv" into library xil_defaultlib WARNING: [VRFC 10-2167] variable fT must explicitly be declared as automatic or static [/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/src/rtl/TestBench.sv:80] INFO: [VRFC 10-311] analyzing module TestBench INFO: [VRFC 10-2263] Analyzing Verilog file "/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/xproject/gmii_switch.sim/sim_1/behav/glbl.v" into library xil_defaultlib INFO: [VRFC 10-311] analyzing module glbl xvhdl -m64 --relax -prj TestBench_vhdl.prj INFO: [USF-XSim-69] 'compile' step finished in '0' seconds INFO: [USF-XSim-3] XSim::Elaborate design INFO: [USF-XSim-61] Executing 'ELABORATE' step in '/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/xproject/gmii_switch.sim/sim_1/behav' Vivado Simulator 2017.1 Copyright 1986-1999, 2001-2016 Xilinx, Inc. All Rights Reserved. Running: /home/xakstreet/XilinxDistr/Vivado/2017.1/bin/unwrapped/lnx64.o/xelab -wto 9b9d5eb16de34b8c975b93350c2304c7 --debug typical --relax --mt 8 -L fifo_generator_v13_1_4 -L xil_defaultlib -L axis_infrastructure_v1_1_0 -L axis_data_fifo_v1_1_13 -L axis_clock_converter_v1_1_13 -L unisims_ver -L unimacro_ver -L secureip -L xpm --snapshot TestBench_behav xil_defaultlib.TestBench xil_defaultlib.glbl -log elaborate.log Using 8 slave threads. Starting static elaboration WARNING: [VRFC 10-278] actual bit length 10 differs from formal bit length 16 for port s_axis_tdata [/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/src/rtl/gmii_data_combiner.sv:82] WARNING: [VRFC 10-278] actual bit length 10 differs from formal bit length 16 for port m_axis_tdata [/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/src/rtl/gmii_data_combiner.sv:86] WARNING: [VRFC 10-1783] select index 2 into rrst_reg is out of bounds [/wrk/2017.1/nightly/2017_04_14_1846317/packages/customer/vivado/data/ip/xilinx/fifo_generator_v13_1/simulation/fifo_generator_vlog_beh.v:4885] WARNING: [VRFC 10-597] element index -1 into num_read_words_dc is out of bounds [/wrk/2017.1/nightly/2017_04_14_1846317/packages/customer/vivado/data/ip/xilinx/fifo_generator_v13_1/simulation/fifo_generator_vlog_beh.v:5490] WARNING: [VRFC 10-597] element index -1 into num_write_words_dc is out of bounds [/wrk/2017.1/nightly/2017_04_14_1846317/packages/customer/vivado/data/ip/xilinx/fifo_generator_v13_1/simulation/fifo_generator_vlog_beh.v:5540] Completed static elaboration Starting simulation data flow analysis Completed simulation data flow analysis ERROR: [XSIM 43-3316] Signal SIGSEGV received. Printing stacktrace... [0] /home/xakstreet/XilinxDistr/Vivado/2017.1/bin/unwrapped/lnx64.o/xelab() [0x6fd754] [1] /home/xakstreet/XilinxDistr/Vivado/2017.1/bin/unwrapped/lnx64.o/xelab() [0x75e249] [2] /home/xakstreet/XilinxDistr/Vivado/2017.1/bin/unwrapped/lnx64.o/xelab() [0x75e377] [3] /home/xakstreet/XilinxDistr/Vivado/2017.1/bin/unwrapped/lnx64.o/xelab() [0x75e377] [4] /home/xakstreet/XilinxDistr/Vivado/2017.1/bin/unwrapped/lnx64.o/xelab() [0x76a21b] [5] /home/xakstreet/XilinxDistr/Vivado/2017.1/bin/unwrapped/lnx64.o/xelab() [0x71838b] [6] /home/xakstreet/XilinxDistr/Vivado/2017.1/bin/unwrapped/lnx64.o/xelab() [0x46783c] [7] /home/xakstreet/XilinxDistr/Vivado/2017.1/bin/unwrapped/lnx64.o/xelab() [0x476c54] [8] /home/xakstreet/XilinxDistr/Vivado/2017.1/bin/unwrapped/lnx64.o/xelab() [0x44b9ef] [9] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7) [0x7ffa5160db97] [10] /home/xakstreet/XilinxDistr/Vivado/2017.1/bin/unwrapped/lnx64.o/xelab() [0x465621] Done INFO: [USF-XSim-69] 'elaborate' step finished in '1' seconds INFO: [USF-XSim-99] Step results log file:'/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/xproject/gmii_switch.sim/sim_1/behav/elaborate.log' ERROR: [USF-XSim-62] 'elaborate' step failed with error(s). Please check the Tcl console output or '/home/xakstreet/Documents/Xilinx_projects/Vivado17_1/gmii_switch/xproject/gmii_switch.sim/sim_1/behav/elaborate.log' file for more information. ERROR: [Vivado 12-4473] Detected error while running simulation. Please correct the issue and retry this operation. ERROR: [Common 17-39] 'launch_simulation' failed due to earlier errors. Я вот не пойму - это вивадо симулятор (17.1) так не дружит с систем верилогом или я что-то не так делаю В файле лога продублирована информация про SIGSEGV - я не знаю что это за сигнал =/ (https://github.com/xakstreet/gmii_switch - вот сам проект для которого этот файл симуляции) как-то я много понаписал лишнего - суть вопроса в том - использует ли кто в вивадо task в интерфейсах и вызывал ли параллельно 2 task через 2 interface одного типа? Ест ли это симулятор вивадо или надо перейти на моделсим? P/S Проблема выявлена - нельзя class.randomize делать внутри процесса, который внутри интерфейса. Если вынести класс из task, а операцию randomize проделывать отдельно не в interface, то вроде как все работает interface gmii_interface_io_outer (input clk, gmii_interface_io.master port); frameParameters fT = new; modport sendData(import send_rx_frame); task send_rx_frame(input logic [47:0] MAC_SRC_VAL, input logic [47:0] MAC_DST_VAL); $display("Shrinked = %d, Size = %d", fT.shrinked_preamble, fT.frame_length); port.rx_dv = 0; port.rx_err = 0; port.rxd = 8'h00; for(int i=0;i<12;i++)begin : send_interframe @(posedge clk); port.rx_dv = 0; port.rx_err = 0; port.rxd = 8'h55; end for(int i=0;i<(6+fT.shrinked_preamble);i++)begin : send_preamble @(posedge clk); port.rx_dv = 1; port.rx_err = 0; port.rxd = 8'h55; end @(posedge clk);//end of preamble port.rx_dv = 1; port.rx_err = 0; port.rxd = 8'hD5; for(int i=0;i<6;i++)begin : send_MAC_dst @(posedge clk); port.rx_dv = 1; port.rx_err = 0; if (fT.frame_type==BROADCAST_P) begin port.rxd = 8'hFF; end else begin port.rxd = MAC_DST_VAL[i*8+:8]; end end for(int i=0;i<6;i++)begin : send_MAC_src @(posedge clk); port.rx_dv = 1; port.rx_err = 0; port.rxd = MAC_SRC_VAL[i*8+:8]; end for(int i=0;i<fT.frame_length;i++)begin : send_payload @(posedge clk); port.rx_dv = 1; port.rx_err = 0; port.rxd = $urandom(); end @(posedge clk);//end of packet port.rx_dv = 0; port.rx_err = 0; port.rxd = 8'h55; endtask : send_rx_frame endinterface: gmii_interface_io_outer initial begin : sender_0 @clk_start;//wait phase initialize gmii_flow_0.fT.randomize; gmii_flow_0.sendData.send_rx_frame(20,40); end initial begin : sender_1 @clk_start;//wait phase initialize gmii_flow_1.fT.randomize; gmii_flow_1.fT.randomize; gmii_flow_1.sendData.send_rx_frame(20,40); end Извиняюсь за сумбур, проблему-то решил, но причины возникновения не понял Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 1 30 ноября, 2019 Опубликовано 30 ноября, 2019 · Жалоба Возможно, гуру верификации будут бить меня ногами, но тащить task в interface - как-то не логично. Интерфейсы должны просто соединять модули, классы и т.д. А вот внутри этих модулей и классов должны изменяться сигналы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 30 ноября, 2019 Опубликовано 30 ноября, 2019 · Жалоба 5 hours ago, nice_vladi said: Возможно, гуру верификации будут бить меня ногами, но тащить task в interface - как-то не логично. Интерфейсы должны просто соединять модули, классы и т.д. А вот внутри этих модулей и классов должны изменяться сигналы. Я осваиваю этот функционал по учебнику Дональда Томаса - здесь представлено довольно удобно - если есть задача протестировать именно интерфейс, то можно поступить так как описано. То есть внутри интерфейса есть таск по его проверке/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 1 декабря, 2019 Опубликовано 1 декабря, 2019 · Жалоба 11 hours ago, nice_vladi said: Возможно, гуру верификации будут бить меня ногами, но тащить task в interface - как-то не логично. Интерфейсы должны просто соединять модули, классы и т.д. А вот внутри этих модулей и классов должны изменяться сигналы. логика в интерфейсе тоже не логично? :) таски в интерфейсах это подходы к реализации драйверов. Т.е. можно не меняя скелета проекта подменить поведенческий код, вызывающий таски, на ртл код, использующий сигналы интерфейса. Другое дело что гуру верификации признали этот метод не эффективным и старым. Т.к. он не дает широкого reusability. Также авторы uvm забраковали концепцию виртуальных интерфейсов, они рекомендовали классы в модулях с интерфейсами, которые позволяют использовать всю ширину ООП для работы) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 1 декабря, 2019 Опубликовано 1 декабря, 2019 · Жалоба 12 hours ago, Lutovid said: по учебнику Дональда Томаса Случайно не "Логическое проектирование и верификация систем на SysytemVerilog"? В таком случае советую забыть об этой книге. Хотя бы на год-два. И почитать что-то более полезное и вразумительное. Обрести понимание конструкций и функционала языка. Книга написана плохо и с кучей ошибок (русский вариант, английский всё ещё не нашёл, чтобы проверить). Да там есть полезные вещи, но только в случае если Вы понимаете конструкции и видите где есть ошибки, чтобы их не повторять у себя. Что касается Ваших ошибок симуляции, то можно и таски и классы и всё это объединять в интерфейсе, но делать это правильно! Увы эта книга не научит этому. Начните с "Virilog and SystemVerilog Gotchas" от Stuart Sutherland и Don Mills. Я считаю что это самая первая и главная настольная книга разработчика на Verilog. Возможно там будет объяснена и Ваша проблема (я просто к тестированию имею достаточно посредственное отношение на уровне модулей и проверки работоспособности). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 1 декабря, 2019 Опубликовано 1 декабря, 2019 · Жалоба 32 minutes ago, Nick_K said: Случайно не "Логическое проектирование и верификация систем на SysytemVerilog"? В таком случае советую забыть об этой книге. Хотя бы на год-два. И почитать что-то более полезное и вразумительное. Обрести понимание конструкций и функционала языка. Книга написана плохо и с кучей ошибок (русский вариант, английский всё ещё не нашёл, чтобы проверить). Да там есть полезные вещи, но только в случае если Вы понимаете конструкции и видите где есть ошибки, чтобы их не повторять у себя. Да, эта книга. Я читал ее с целью - структурировать свои знания и узнать новые возможности, про которые я не знал. Очевидные ошибки ака опечатки я в этой книге встречал, как и в любой другой. Подскажите пожалуйста какие принципиальные ошибки вы там увидели? Или вы увидели их у меня в коде? P/S об ошибках кстати можно написать в издательство - они как раз об этом упоминают в книге, если бы я увидел - я бы наверное написал бы им:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 1 декабря, 2019 Опубликовано 1 декабря, 2019 · Жалоба 45 minutes ago, Lutovid said: Очевидные ошибки ака опечатки я в этой книге встречал, как и в любой другой. Да там не опечатки, а конкретные фейлы. И их слишком много, чтобы все перечислять. Я уже поднимал эту тему тут на форуме и снова вспоминать не охота. В любом случае воспринимать за чистую правду эту книгу не советую. Так как некое пособие, кок можно сделать. По вашему коду я ничего не скажу, кроме того, что нужно упрощать. Я лично ООП в тестбенчах не использую и скорее всего не буду - мне хватает головной боли в синтезируемом проекте, чтобы ещё разбираться где какой класс не работает или другие "прелести" вылазят. Упрощайте себе жизнь ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба @Lutovid а использовать блокирующие присваивания и не использовать clocking block этот же самый учебник рекомендует? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба 4 hours ago, des00 said: @Lutovid а использовать блокирующие присваивания и не использовать clocking block этот же самый учебник рекомендует? В учебнике расписана разница блокирующего и не блокирующего и почему они так называются. Представленный файл - не синтезируемый и в нем я решил использовать этот тип присвоений исходя из логики работы симулятора. Вполне мог ошибиться, но если вы про тезис - что во всех модулях always должны использоваться неблокирующие присвоения, то в синтезируемых модулях у меня так и есть. про clocking block мне ничего не известно и в учебнике такого не припомню=/ Аааа, если вы про initial, который генерит клок, то это из ксаевского language template 23 hours ago, Nick_K said: Я лично ООП в тестбенчах не использую и скорее всего не буду - мне хватает головной боли в синтезируемом проекте, чтобы ещё разбираться где какой класс не работает или другие "прелести" вылазят. Упрощайте себе жизнь ;) Я не использовал, но хочу попробовать, все это эксперимент, который я провожу в свободное от работы время Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба 2 hours ago, Lutovid said: В учебнике..... у вас код поведенческий, но, вы моделируете синхронную логику, через асинхронные присваивания (блокирущие). Почитайте лучше Writing Testbenches using SV, полезнее будет. ЗЫ. вот генератор у вас как раз классический) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба 19 minutes ago, des00 said: Почитайте лучше Writing Testbenches using SV, полезнее будет. Спасибо, он тоже на очереди. ЗЫ Что-то я не понял - если генератор норм, хотя там то же самое блокирующее присвоение, почему в остальных местах не норм... Но видимо стоит сначала изучить описанные вами материалы, перед тем как задавать такие вопросы:) + как тогда использовать fork join any или join all если блокирующих операций нет в теле... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба 2 hours ago, Lutovid said: Но видимо стоит сначала изучить описанные вами материалы, перед тем как задавать такие вопросы:) SV for verification, Writing testbenches, Universal Methodology Manual изучите, потом, если останутся темные места, можно будет обсудить :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба 24 minutes ago, des00 said: SV for verification, Writing testbenches, Universal Methodology Manual изучите, потом, если останутся темные места, можно будет обсудить :) Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба @des00 именно это учебник и рекомендует. В самых первых экзамплах. И мы это уже обсуждали в другой теме :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться