Jump to content

    
Sign in to follow this  

Recommended Posts

Привет всем!

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

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

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
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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this