Jump to content

    
Sign in to follow this  
alxkon

SystemVerilog видимость parameter в task

Recommended Posts

Приветствую всех!

С SystemVerilog пока особого опыта нет, изучаю понемногу. 

 Тестбенч, все сгенерировано с помощью Clarity ( Lattice Diamond 3.12 )

В топ модуле тестбенча  pix2byte_tb.v 

определенны различные параметры, например  num_frames

`timescale 1 ps / 1fs
`include "dut_defines.v"
`include "tb_params.v"
`include "vid_timing_gen_driver.v"
`include "byte_out_monitor.v"

module top();

`include "dut_params.v"

parameter num_frames    = `NUM_FRAMES;
parameter hfront_porch  = `HFRONT;
parameter hsync_pulse   = `HPULSE;
parameter hback_porch   = `HBACK;
parameter vfront_porch  = `VFRONT;
parameter vsync_pulse   = `VPULSE;
parameter vback_porch   = `VBACK;

//`ifndef MISC_ON
//  parameter init_drive_delay = `INIT_DRIVE_DELAY;
//`endif

parameter output_width_in_bytes = (DATA_WIDTH*NUM_TX_LANE*TX_GEAR)/128;
parameter input_width_in_bits = PIX_WIDTH*NUM_PIX_LANE;
parameter input_width_in_bytes = input_width_in_bits[0] ? input_width_in_bits :
                                 input_width_in_bits[1] ? input_width_in_bits/2 :
                                 input_width_in_bits[2] ? input_width_in_bits/4 :
                                                          input_width_in_bits/8;
parameter multiple_bytes = input_width_in_bytes*output_width_in_bytes;
parameter least_common_multiple_bytes = multiple_bytes[0] ? multiple_bytes*4 : multiple_bytes[1] ? multiple_bytes*2 : multiple_bytes;
parameter number_of_bytes = (1 + `NUM_BYTES/least_common_multiple_bytes)*least_common_multiple_bytes;
parameter total_pix = number_of_bytes*8/PIX_WIDTH;
parameter act_pix = total_pix/NUM_PIX_LANE;

parameter total_line     = `NUM_LINES;
parameter pixclk_period  = `SIP_PCLK/2;
parameter byteclk_period = (pixclk_period*DATA_WIDTH*NUM_TX_LANE*TX_GEAR)/(PIX_WIDTH*NUM_PIX_LANE*16);
localparam exp_byte_count = `NUM_FRAMES * `NUM_LINES * number_of_bytes;

reg     reset_n;
reg     pix_clk_i   = 0;
reg     byte_clk_i  = 0;
reg     mon_en      = 0;
reg     start_vid   = 0;
reg     byte_log_en = 0;
wire    rst_n_i     = reset_n;
wire    byte_clk    = byte_clk_i;

integer line_cnt     = 0;
integer frame_cnt    = 0;
integer pixel_cnt    = 0;
integer testfail_cnt = 0;

integer txfr_delay = 100000/byteclk_period;
integer wc_delay = number_of_bytes/(GEAR_16+1)*NUM_TX_LANE;

reg  dvalid_i;
wire de_i;
wire hsync_i, vsync_i;
wire fv_i, lv_i;
wire eof;

wire [PIX_WIDTH-1:0] pix_data9_i;

.....

потом в тексте есть include

...............

`ifdef TX_DSI
  `include "test_snow_pixel2byte_dsi_reset.v"
  `include "test_snow_pixel2byte_dsi_trans.v"
`else
  `include "test_snow_pixel2byte_csi2_trans.v"
  `include "test_snow_pixel2byte_csi2_reset.v"
`endif
  
...............

....

и вызов

...........
  
@(posedge pix_clk_i);
    byte_log_en = 1;
    start_vid = 1;
    $display(" test_hsync_front_porch : %d \n", hfront_porch);
    $display(" test_hsync_width       : %d \n", hsync_pulse);
    $display(" test_hsync_back_porch  : %d \n", hback_porch);
    $display(" test_h_width           : %d \n", act_pix);
    $display(" test_v_height          : %d \n", total_line);
    $display(" test_vsync_front_porch : %d \n", vfront_porch);
    $display(" test_vsync_width       : %d \n", vsync_pulse);
    $display(" test_vsync_back_porch  : %d \n", vback_porch);
    mon_en = 1;
    test_snow_pixel2byte_csi2_trans;
  
    `ifdef DSI_RESET_TEST1
       byte_log_en = 0;
       start_vid = 1;
       mon_en = 1;
       test_snow_pixel2byte_dsi_reset;
    `endif
      
 .................

 

В  test_snow_pixel2byte_csi2_trans.v определен такой task

// =========================================================================
// Filename: test_snow_pixel2byte_csi2_trans.v
// Copyright(c) 2017 Lattice Semiconductor Corporation. All rights reserved.
// =========================================================================

//`ifdef CSI2_TEST1

task test_snow_pixel2byte_csi2_trans;
   begin

      fork

  `ifdef MISC_ON
      if (data_type !== 6'bzz_zzz)  // 20191217
      while((frame_cnt !== num_frames)) begin

.........................

 

Насколько я понимаю перед begin должны быть перечислены input и output для даного task, но их нет.

 

Все нужные файлы включены в .do файл, использую vlog -sv -work lib  filename.v чтобы добавить исходник к тестбенчу

 

ModelSim ругается, не видит frame_cnt

# ** Error: ../ipcore/pix2byte/pixel2byte_eval/testbench/test_snow_pixel2byte_csi2_trans.v(83): (vlog-2730) Undefined variable: 'frame_cnt'.
# ** Error: ../ipcore/pix2byte/pixel2byte_eval/testbench/test_snow_pixel2byte_csi2_trans.v(83): (vlog-2730) Undefined variable: 'num_frames'.
###### ../ipcore/pix2byte/pixel2byte_eval/testbench/test_snow_pixel2byte_csi2_trans.v(84):         @(posedge  eof);
# ** Error: ../ipcore/pix2byte/pixel2byte_eval/testbench/test_snow_pixel2byte_csi2_trans.v(84): (vlog-2730) Undefined variable: 'eof'.

Наверное есть какой-то нюанс, который мне не очевиден, я все же думаю автор этого теста проверял что генерирует wizard и запускал свой тест.

Оригинального DO файла нет, он не сгенирирован wizard-ом.

 

Подскажите пожалуйста, какая была задумка у автора этого дизайна, как task  должен видеть переменные из главного модуля?

 

Edited by alxkon

Share this post


Link to post
Share on other sites
13 minutes ago, alxkon said:

Насколько я понимаю перед begin должны быть перечислены input и output для даного task, но их нет.

таск и функция могут быть без аргументов.

13 minutes ago, alxkon said:

Наверное есть какой-то нюанс, который мне не очевиден, я все же думаю автор этого теста проверял что генерирует wizard и запускал свой тест.

компилировать нужно файл с модулем, а не инклуд файл. т.к. каждый файл в команде компилируется отдельно и в таске действительно не определены эти сигналы

Share this post


Link to post
Share on other sites
45 минут назад, des00 сказал:

таск и функция могут быть без аргументов.

компилировать нужно файл с модулем, а не инклуд файл. т.к. каждый файл в команде компилируется отдельно и в таске действительно не определены эти сигналы

Спасибо огромное! Это ведь действительно очевидно, туплю... С RTL и TB на Verilog и SV не работал до сих пор особо, так, подправить и разобраться как работает.

Зато теперь открыл для себя +include+

:clapping:

Share this post


Link to post
Share on other sites

в рамках занудства - это не SV, это самый что ни на есть классический Verilog (вроде даже из 90-х, а не обновленный в 2000-х)

у латтиса вообще плохо с SV, если с ним работать, то нужно через нетлист - в Симплифае SV проект, который генерит нетлист, а потом этот edn уже в Даймонд брать.

сейчас (в Diamond 3.11) вроде проект не валится от SV файла, но всякие чудеса - типа Reveal не работает с SV - вылазят в неожиданных местах

 

Share this post


Link to post
Share on other sites
01.04.2021 в 23:00, yes сказал:

в рамках занудства - это не SV, это самый что ни на есть классический Verilog (вроде даже из 90-х, а не обновленный в 2000-х)

у латтиса вообще плохо с SV, если с ним работать, то нужно через нетлист - в Симплифае SV проект, который генерит нетлист, а потом этот edn уже в Даймонд брать.

сейчас (в Diamond 3.11) вроде проект не валится от SV файла, но всякие чудеса - типа Reveal не работает с SV - вылазят в неожиданных местах

 

Да, Вы правы. Это следствие ошибки на которую указал des00. Мне нужно было запустить TB 3-х разных латтисовских IP. DO файлов там не было я сам быстро настрогал.  Начал с первого ядра сразу криво -  компиляция include файла привела к появлению ошибок, которые были мною приняты как смешаный Verilog разных стандартов. Попробовал в Modelsim выбрать год стандарта и оказалось что выбрав SV ошибок нет, вот и решил что это SV. Симуляция прошла. TB второго ядра это copy-paste первого TB. А на третьем споткнулся... Нашел Стюарта Сазерленда буду вникать сразу в SV.

 

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