как я могу реализовать ограничение типа переключателя в specman?

Я знаком с тернарными ограничениями:

Keep exp1 ? exp2 : exp3;

Где exp2 остается истинным, если exp1 истинно, а exp3 остается истинным, если exp1 ложно. Однако в моем случае exp1 может содержать несколько значений, и я хотел бы, чтобы это затрагивало столько выражений. соответственно, и хотелось бы, чтобы все это делалось через генератор (не процедурно).

Например, я хотел бы что-то вроде этого:

keep a =>   a==1 : exp1 
       a==2 : exp2
       a==3: exp3
        …

Спасибо,


person user3444042    schedule 23.03.2015    source источник


Ответы (2)


Такие возможности ограничения регистра переключения не реализованы в specman. Однако разработчики предоставили нам макросы, с помощью которых мы можем реализовать многие творческие идеи, такие как эта.

Ограничение переключения регистра, которое вы запрашиваете, может быть легко реализовано с помощью конкатенации тернарных ограничений:

Keep a==1 ? exp1 : a==2 ? exp2 : exp3;

Конечно, макрос, создающий такие ограничения, должен уметь обрабатывать любое количество различных случаев. Рассмотрим этот макрос:

 define <switch_case_gen'struct_member> "keep map <exp> \[<exp>,...\] to <exp> \[<exp>,...\]" as computed {

var num_s:string = str_expand_dots(<2>);
var str_s: string = str_expand_dots(<4>);
var ln:list of string = str_split(num_s,",");;
var ls:list of string = str_split(str_s,",");

if (ln.size() != ls.size()) {
    error("keep map - you need to specify an equal number for items for both lists");
};
if (ln.size()<2) {
    error("keep map - this macro should recieve lists of at least size 2");
};

var constraint:string;
constraint="keep ";
for each in ln {
    if (index == ln.size()-1) {constraint = append(constraint,<3>,"==",ls[index],";");}
    else {constraint = append(constraint,<1>,"==",ln[index]," ? ", <3>,"==",ls[index],":");};
};
out("parsed constraint is : ",constraint);
return constraint;
 };

Пример использования в этом случае:

 struct s {
      id:uint(bits:2);
      str:string;
      keep map id [0,1,2,3] to str ["id0","id1","id2","id3"]    
 };
person yuvalg    schedule 23.03.2015

Вы можете легко выразить это в структурированном виде:

keep c_switch is all of {
    a==1 => exp1;
    a==2 => exp2;
    ...
}; 
person Thorsten    schedule 24.03.2015