Jump to content

    

task в interface

Привет всем!

Осваиваю новые конструкции языка и столкнулся с проблемой

Написал Вот такой блок симуляции

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

Извиняюсь за сумбур, проблему-то решил, но причины возникновения не понял

Share this post


Link to post
Share on other sites

Возможно, гуру верификации будут бить меня ногами, но тащить task в interface - как-то не логично. Интерфейсы должны просто соединять модули, классы и т.д. А вот внутри этих модулей и классов должны изменяться сигналы.

Share this post


Link to post
Share on other sites
5 hours ago, nice_vladi said:

Возможно, гуру верификации будут бить меня ногами, но тащить task в interface - как-то не логично. Интерфейсы должны просто соединять модули, классы и т.д. А вот внутри этих модулей и классов должны изменяться сигналы.

Я осваиваю этот функционал по учебнику Дональда Томаса - здесь представлено довольно удобно - если есть задача протестировать именно интерфейс, то можно поступить так как описано. То есть внутри интерфейса есть таск по его проверке/

Share this post


Link to post
Share on other sites
11 hours ago, nice_vladi said:

Возможно, гуру верификации будут бить меня ногами, но тащить task в interface - как-то не логично. Интерфейсы должны просто соединять модули, классы и т.д. А вот внутри этих модулей и классов должны изменяться сигналы.

логика в интерфейсе тоже не логично? :) 

таски в интерфейсах это подходы к реализации драйверов. Т.е. можно не меняя скелета проекта подменить поведенческий код, вызывающий таски, на ртл код, использующий сигналы интерфейса. Другое дело что гуру верификации признали этот метод не эффективным и старым. Т.к. он не дает широкого reusability. Также авторы uvm забраковали концепцию виртуальных интерфейсов, они рекомендовали классы в модулях с интерфейсами, которые позволяют использовать всю ширину ООП для работы)

 

Share this post


Link to post
Share on other sites
12 hours ago, Lutovid said:

по учебнику Дональда Томаса

Случайно не "Логическое проектирование и верификация систем на SysytemVerilog"? В таком случае советую забыть об этой книге. Хотя бы на год-два. И почитать что-то более полезное и вразумительное. Обрести понимание конструкций и функционала языка. Книга написана плохо и с кучей ошибок (русский вариант, английский всё ещё не нашёл, чтобы проверить). Да там есть полезные вещи, но только в случае если Вы понимаете конструкции и видите где есть ошибки, чтобы их не повторять у себя.

Что касается Ваших ошибок симуляции, то можно и таски и классы и всё это объединять в интерфейсе, но делать это правильно! Увы эта книга не научит этому. Начните с "Virilog and SystemVerilog Gotchas" от Stuart Sutherland и Don Mills. Я считаю что это самая первая и главная настольная книга разработчика на Verilog. Возможно там будет объяснена и Ваша проблема (я просто к тестированию имею достаточно посредственное отношение на уровне модулей и проверки работоспособности).

Share this post


Link to post
Share on other sites
32 minutes ago, Nick_K said:

Случайно не "Логическое проектирование и верификация систем на SysytemVerilog"? В таком случае советую забыть об этой книге. Хотя бы на год-два. И почитать что-то более полезное и вразумительное. Обрести понимание конструкций и функционала языка. Книга написана плохо и с кучей ошибок (русский вариант, английский всё ещё не нашёл, чтобы проверить). Да там есть полезные вещи, но только в случае если Вы понимаете конструкции и видите где есть ошибки, чтобы их не повторять у себя.

Да, эта книга. Я читал ее с целью - структурировать свои знания и узнать новые возможности, про которые я не знал. Очевидные ошибки ака опечатки я в этой книге встречал, как и в любой другой. Подскажите пожалуйста какие принципиальные ошибки вы там увидели? Или вы увидели их у меня в коде?

P/S об ошибках кстати можно написать в издательство - они как раз об этом упоминают в книге, если бы я увидел - я бы наверное написал бы им:)

Share this post


Link to post
Share on other sites
45 minutes ago, Lutovid said:

Очевидные ошибки ака опечатки я в этой книге встречал, как и в любой другой.

Да там не опечатки, а конкретные фейлы. И их слишком много, чтобы все перечислять. Я уже поднимал эту тему тут на форуме и снова вспоминать не охота. В любом случае воспринимать за чистую правду эту книгу не советую. Так как некое пособие, кок можно сделать.

По вашему коду я ничего не скажу, кроме того, что нужно упрощать. Я лично ООП в тестбенчах не использую и скорее всего не буду - мне хватает головной боли в синтезируемом проекте, чтобы ещё разбираться где какой класс не работает или другие "прелести" вылазят. Упрощайте себе жизнь ;)

Share this post


Link to post
Share on other sites

@Lutovid а использовать блокирующие присваивания и не использовать clocking block этот же самый учебник рекомендует? 

Share this post


Link to post
Share on other sites
4 hours ago, des00 said:

@Lutovid а использовать блокирующие присваивания и не использовать clocking block этот же самый учебник рекомендует? 

В учебнике расписана разница блокирующего и не блокирующего и почему они так называются. Представленный файл - не синтезируемый и в нем я решил использовать этот тип присвоений исходя из логики работы симулятора. Вполне мог ошибиться, но если вы про тезис - что во всех модулях always должны использоваться неблокирующие присвоения, то в синтезируемых модулях у меня так и есть. про clocking block мне ничего не известно и в учебнике такого не припомню=/

 

Аааа, если вы про initial, который генерит клок, то это из ксаевского language template

23 hours ago, Nick_K said:

 Я лично ООП в тестбенчах не использую и скорее всего не буду - мне хватает головной боли в синтезируемом проекте, чтобы ещё разбираться где какой класс не работает или другие "прелести" вылазят. Упрощайте себе жизнь ;)

Я не использовал, но хочу попробовать, все это эксперимент, который я провожу в свободное от работы время

Share this post


Link to post
Share on other sites
2 hours ago, Lutovid said:

В учебнике.....

у вас код поведенческий, но, вы моделируете синхронную логику, через асинхронные присваивания (блокирущие). Почитайте лучше Writing Testbenches using SV, полезнее будет. 

ЗЫ. вот генератор у вас как раз классический) 

Share this post


Link to post
Share on other sites
19 minutes ago, des00 said:

Почитайте лучше Writing Testbenches using SV, полезнее будет.

Спасибо, он тоже на очереди.

ЗЫ Что-то я не понял - если генератор норм, хотя там то же самое блокирующее присвоение, почему в остальных местах не норм... Но видимо стоит сначала изучить описанные вами материалы, перед тем как задавать такие вопросы:)

+ как тогда использовать fork join any или join all если блокирующих операций нет в теле...

Share this post


Link to post
Share on other sites
2 hours ago, Lutovid said:

 Но видимо стоит сначала изучить описанные вами материалы, перед тем как задавать такие вопросы:)

SV for verification, Writing testbenches, Universal Methodology Manual изучите, потом, если останутся темные места, можно будет обсудить :)

Share this post


Link to post
Share on other sites
24 minutes ago, des00 said:

SV for verification, Writing testbenches, Universal Methodology Manual изучите, потом, если останутся темные места, можно будет обсудить :)

Спасибо!

Share this post


Link to post
Share on other sites

@des00 именно это учебник и рекомендует. В самых первых экзамплах. И мы это уже обсуждали в другой теме :-)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this