SV ограничивает объем и рандомизацию

В испытательном стенде SystemVerilog UVM мы рандомизируем объекты транзакций и для некоторых конкретных тестов создаем дополнительные ограничения. Однако эти ограничения тестового набора используются механизмом рандомизации только в том случае, если вы вызываете метод тестового набора randomize(), а не obj.randomize(). Это довольно запутанно.

Интересно, почему все ограничения на объект не используются независимо от того, какой рандомизация вызывается? Почему ограничения имеют область действия?

Например:

class trans;
   rand int addr;
 
   constraint addr_c;  // Method 1: constraint prototype

   function void post_randomize();
     $display("addr %d",addr);
   endfunction
endclass

//////////////////// Test case code /////////////////

// Method 1: extend constraint prototype addr_c external to test class.
// constraint trans::addr_c { addr > 0 && addr < 10; } 
// works but requires prototype, careful if trans is in another package

class my_test;
  trans trans1;
  
  // Method 2: Add constraint to the test
  constraint test_constraint_c { trans1.addr > 11 && trans1.addr < 20; }
  
  function new();
    trans1 = new;
    repeat (20) begin
      // This doesn't use test_constraint_c (why??)
      assert(trans1.randomize()) else $display("TEST", "Randomization Failed");
      // This uses test_constraint_c
      assert(randomize(trans1)) else $display("TEST", "Randomization Failed");
    end
  endfunction
endclass

module tb;
  my_test test1;
  initial test1 = new;
endmodule 
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть 2 класса, которые не связаны друг с другом: trans и my_test.

Класс trans не знает об ограничении test_constraint_c, потому что ограничение является лишь частью класса my_test. Таким образом, когда вы вызываете функцию randomize для объекта (trans1.randomize()), она не имеет ограничений для применения.

В тесте, когда вы вызываете метод randomize для переменной trans1, он будет применять любые активные ограничения в классе my_test, а именно test_constraint_c.

Альтернативный подход — расширить класс trans новым блоком ограничения.

Другие вопросы по теме