Перейти к содержанию
    

Первые пробы пера SV testbench

Добрый день!

 

Хочу сделать тестбенч для своего модуля и нашел подходящую корку vip i2c на сайте syswip.

 

Мой код:

//first probe of SV OOP 
`timescale 1ns/10ps
module tb_top;


`include "i2c_s_if.sv"


bit clk;
bit rst_n;

wire  sda;


initial begin
clk = 0;
forever begin
  #5 clk <= ~clk;
end
end


initial begin
rst_n = 0;
#50;
@(posedge clk)
rst_n = 1;
end




i2c_s_if first(sda);

test test_inst(first);

io_expander_controller DUT (
   .clk                (clk), 
   .rst_n              (rst_n), 
   .ar_test            (), 
   .data0_from_exp     (), 
   .data1_from_exp     (), 
   .io_exp_sda         (sda), 
   .io_exp_scl         (first.scl)
   );


endmodule

 

 

сам интерфейс:

`timescale 1ns/10ps

interface i2c_s_if(inout tri1 sda);
 // I2C bus signals
 wire   scl;
 // Tri-state buffer control
 logic  sda_oe;
 // Tri-state buffers
 assign sda = sda_oe ? 1'bz : 1'b0;

endinterface

 

 

и код тестбенча:

`timescale 1ns/10ps


program test(i2c_s_if i2c_slave_if);
  import I2C_S::*;
  import PACKET::*;
  typedef bit [7:0]    bit8;
  typedef bit8 packet[$];
  initial begin
  I2C_s_env i2c_slave   = new(i2c_slave_if, "Standart", 55);
  i2c_slave.startEnv();
  #100000;
  $display("Bla-Bla!");
  #100000;
  $stop;
  end
endprogram

 

Бла-бла в квесте не появляется, sda файла верхнего уровня в x.

 

Что я делаю не так?

ПРиветствуются комментарии к структуре, хотя я понимаю, что нужно входить в UVM иерархию

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я, конечно, не гуру тестбенчей, но я не понял, какой модуль тестируется и где он, собственно, вообще в этом коде. Всё-таки: свой модуль или найденная подходящая корка?

Какие-то пакеты импортируются, которых нет, какие-то экземпляры модулей объявляются, описания которых нигде нет в коде. Смешивается Verilog и SystemVerilog. Вы понимаете, что Вы делаете вообще?

Изменено пользователем GREGOR_812

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да. У меня есть DUT - написан на верилоге. Я с его инстанцировал в топ модуль, с помощью интерфейса соединил с vip i2c коркой и на это остановился. Попытался запустить в квестасим, симулятор не ругается, но на sda я вижу х.

Экспериментировал так, что написал модпорты на интерфейс - увидел на sda времянки, но в лог.1. на sda - я вижу пунктир на графике - может конфликт уровней, не знаю вообщем.

Переносил в програм команду дисплей первой строчкой - ничего не показывает. Вот я и не понимаю в чем дело...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Экспериментировал так, что написал модпорты на интерфейс - увидел на sda времянки, но в лог.1. на sda - я вижу пунктир на графике - может конфликт уровней, не знаю вообщем.

Полагаю что дело вот в этом. ИМХО неправильно использована библиотека. А почему, надо курить на нее документацию/сорцы.

post-3453-1465973599_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Додеградировал дизайн до следующего состояния:

Модуль верхнего уровня:



//first probe of SV OOP 
`timescale 1ns/10ps
module tb_top;




bit clk;
bit rst_n;



initial begin
clk = 0;
forever begin
  #5 clk <= ~clk;
end
end


test test_inst();

led DUT(
  .clk     (clk), 
  .rst_n   (rst_n),
  .led     ()
);



endmodule

 

ТЕст модуль:

module led(
input             clk, 
input             rst_n,
output   reg     led
);



always@(posedge clk)
begin
if(rst_n)
  begin
     led <= ~led;
  end
else
  begin
     led <= 1'b0;
  end
end


endmodule

 

И программа:

`timescale 1ns/10ps


program test();

  initial begin
  $display("Bla-Bla0!");
  #100000;
  $display("Bla-Bla!");
  #100000;
  $stop;
  end
endprogram

 

При компиле файла tb_top.sv пишет такое

vsim -voptargs=+acc work.tb_top

# vsim -voptargs=+acc work.tb_top

# ** Note: (vsim-3812) Design is being optimized...

#

# ** Error: test.sv(14): Module 'i2c_s_if' is not defined.

# Optimization failed

# Error loading design

 

Причем модуль i2c_s_if вообще нигде не подключен, не участвует и так далее...

В библиотеке квесты только 3 этих файла.

 

В аттаче библиотека квесты версия 10.2с

tb.rar

 

Что за фигня вообще...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По последнему.

Удалил папку с либой, затем создал все вновь. Програм завелся, надписи получил.

 

Какой то жесткий глюк...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопросец такой:

 

я создал класс и написал к нему ограничения:

 

class Point;
   rand int  x;
   rand int  y;
  constraint range{
      x >= -32768;
      x <= 32767;
      y >= -32768;
      y <= 32767;
  }
  constraint crt{
              x**2 + y**2 <= AMP1**2;
              x**2 + y**2 >= AMP0**2;}
  constraint corner{
      x dist {-32768 := 10, [-32767:-1]:= 1, 0:= 10, [1:32766] := 1, 32767 := 10};
      y dist {-32768 := 10, [-32767:-1]:= 1, 0:= 10, [1:32766] := 1, 32767 := 10};
  }
endclass

 

 

У меня входные данные 16-битные, т.е. можно заменить int на shortint. Но AMP0 и AMP1 int. Как правильно сделать преобразование типов, ибо по кавергруппам я вижу что констрейн crt фейлится?

Проблему решил!

amp_dist: coverpoint int'(x)**2 + int'(y)**2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...