Specman: как ограничить список всеми итерациями переменной, но не только?

Я определил следующую структуру:

struct my_struct {
    var_a : bit;
    var_b : bit;
}; 

В другой структуре я создал список этой структуры:

struct another_struct {
    my_list   : list of my_struct;
    list_size : uint;

    keep list_size >= 4;
};

Что я хочу сделать, так это ограничить my_list, чтобы иметь как минимум все возможные итерации как var_a, так и var_b, но не только, то есть объединить оба ограничения:

extend another_struct {
    keep my_list.is_all_iterations(.var_a, .var_b);
    keep my_list.size() ==  list_size;  
};

Есть ли способ добиться этого?

Спасибо


person Ruben Dahan    schedule 03.09.2020    source источник


Ответы (2)


Я предлагаю создать вспомогательный список и ограничить его подсписком my_list:

list_all_i: list of my_struct;
keep list_all_i.is_all_iterations(.var_a, .var_b);
keep list_all_i in my_list;

Не уверен, что это работает, но я ожидаю, что последнее ограничение будет двунаправленным.

person Thorsten    schedule 03.09.2020

Один из подходов состоит в том, чтобы сначала сгенерировать список, содержащий только варианты, а затем добавить желаемое количество других элементов в post_generate.

<'

struct mys_s {
   a: int [0..3];
   b: int [10, 11];
};

extend sys {
   mys_l: list of mys_s;
   keep mys_l.is_all_iterations(.a,.b);

   !rand_struct: mys_s;

   upper_limit: uint;
   keep upper_limit == 20;

   old_size: uint;
   keep old_size in [read_only(mys_l.size())];

   new_size: uint;
   keep new_size >= read_only(old_size);
   keep new_size < upper_limit;

   post_generate() is {
      for i from 1 to new_size-old_size {
         gen rand_struct;
         mys_l.add(rand_struct);
      };
   };


   run() is also {
      print mys_l;
   };

};


'>

После этого кода ваш список будет иметь все варианты, которые вы хотели, а также произвольное количество других структур, определенных в файле upper_limit.

Output for random seed:

Starting the test ...
Running the test ...
  mys_l = 
item   type        a           b           
---------------------------------------------------------------------------
0.     mys_s       0           10          
1.     mys_s       0           11          
2.     mys_s       1           10          
3.     mys_s       1           11          
4.     mys_s       2           10          
5.     mys_s       2           11          
6.     mys_s       3           10          
7.     mys_s       3           11          
8.     mys_s       3           11          
9.     mys_s       3           10          
10.    mys_s       1           11          
11.    mys_s       1           11          
12.    mys_s       3           10          
13.    mys_s       2           11          
14.    mys_s       0           10          
15.    mys_s       2           11          
16.    mys_s       2           11          
17.    mys_s       2           11 

Обратите внимание, что первые 10 элементов (0-9) содержат варианты, а остальные элементы списка представляют собой случайные структуры.

person Milos Mirosavljevic    schedule 30.11.2020
comment
Я могу улучшить свое решение: если вы хотите рандомизировать список, чтобы вариации не всегда были первыми, вы можете рандомизировать индекс и использовать псевдометод list insert() для вставки случайной структуры. Таким образом, вы получите случайный список, который содержит варианты + случайные структуры. - person Milos Mirosavljevic; 01.12.2020