Пример большого ограничения SystemVerilog

Можете ли вы привести пример большого и сложного ограничения SystemVerilog? Чем больше, тем лучше, и желательно реалистично. Возможно, какой-то расчет адреса, который также зависит от нескольких других переменных.

Я рассматриваю возможность переключения нашего IP-адреса на использование ограничений SystemVerilog, и мое руководство хочет увидеть, насколько легко/сложно создавать/понимать ограничения SystemVerilog.


person Victor Lyuboslavsky    schedule 30.10.2012    source источник


Ответы (2)


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

Вот пример Subbdue, отредактированный для исправления следующих синтаксических ошибок:

  1. Синтаксис SV typedef enum {...} <name>; в отличие от синтаксиса OpenVera enum <name> {...};
  2. Конец объявления перечисления с ;
  3. Объявить переменную channelNumber
  4. Объявить ipVersion как rand
  5. Синтаксис SV <var> inside { [<min>:<max>] } в отличие от синтаксиса OpenVera <var> in { min:max }
  6. Заканчивайте выражения в constraints с помощью ;
  7. Синтаксис SV -> в отличие от синтаксиса OpenVera =>
  8. Исправить опечатку solver -> solve
  9. Исправить опечатку IPVx -> IPVX

Фиксированный пример:

class RandomConstraints;
    typedef enum {IPV4=2, IPV6, IPVX} IpVersionType;

    //Randomly iterate over values without repetition
    randc bit [7:0] cyclicCounter;
    //Regular random variables
    rand bit [15:0] destAddress;
    rand bit [15:0] sourceAddress;
    rand bit [15:0] numberOfPackets;
    rand bit [15:0] packetLength;
    rand bit [3:0] channelNumber;
    rand bit [7:0]  var1;
    rand bit [7:0]  var2;
    rand IpVersionType ipVersion;

    //Non-random variables that can be used to control constraints
    bit [15:0] minNumberOfPackets, maxNumberOfPackets;
    bit [15:0] minPacketLength, maxPacketLength;
    integer IPV4Weight, IPV6Weight;

    constraint cPacketLength {
        packetLength inside { [ minPacketLength : maxPacketLength ] };
    }
    constraint cChannelNumber {
        channelNumber inside {[0:1]};
    }
    // Assuming total weight adds up to 100
    constraint cIPVersionType {
        ipVersion dist { IPV4 := IPV4Weight, IPV6 := IPV6Weight,
          IPVX := (100 - IPV4Weight - IPV6Weight) };
    }
    //Probability of var1 being 1,2,3,4,5 in the ratio 1,2,4,4,4
    constraint cDist1 {
        var1 dist { 1 := 1, 2 := 2, [3:4] := 4 };
    }
    //Probability of var2 being 1,2,3,4,5 is in the ratio 1,2,4/3,4/3,4/3
    constraint cDist2 {
        var2 dist { 1 := 1, 2 := 2, [3:5] :/ 4 };
    }
    //Implication constraint - if(channelNum == i) then { ... }
    constraint cImplication {
        (channelNumber == 0) -> {
            destAddress inside {[0:200]};
            sourceAddress inside {[201:400]};
        }
        (channelNumber == 1) -> {
            destAddress inside {[201:400]};
            sourceAddress inside {[0:200]};
        }
    }
    //Controlling order of constraints solved using a constraint solver
    constraint order_solver {
        solve channelNumber before destAddress;
        solve channelNumber before sourceAddress;
    }

    function new();
        //Setting default min/max packets and min/max packet length
        minNumberOfPackets = 100;
        maxNumberOfPackets = 1000;
        minPacketLength = 128;
        maxPacketLength = 256;
        IPV4Weight = 50;
        IPV6Weight = 30;
    endfunction
endclass
person Paddu    schedule 08.05.2013
comment
Отличная работа. Похоже, мне нужно 2 тыс. баллов, чтобы иметь право просматривать предложенные правки (даже в моих собственных сообщениях :)) .. Поскольку вы приложили усилия, чтобы создать новый пост, я оставлю свой как есть. - person Subbdue; 15.06.2013

Вот пример, возможно, не большой и сложный, но он должен дать вам реалистичное представление о том, как можно использовать ограничения. Здесь вы увидите следующие используемые понятия:

  1. randc и rand — циклические и нециклические случайные величины
  2. Два типа распределенных ограничений
  3. Использование условий if в ограничении с использованием оператора импликации ... Адрес вычисляется в зависимости от другой переменной
  4. Решатель ограниченного порядка
  5. Ограничение диапазона случайной величины по умолчанию в конструкторе
  6. Использование перечисляемого типа в ограничениях

Надеюсь, это поможет... и следите за комментариями в строке:

class RandomConstraints;
    enum IpVersionType {IPV4=2, IPV6, IPVx}

    //Randomly iterate over values without repetition
    randc bit [7:0] cyclicCounter;
    //Regular random variables
    rand bit [15:0] destAddress;
    rand bit [15:0] sourceAddress;
    rand bit [15:0] numberOfPackets;
    rand bit [15:0] packetLength;
    rand bit [7:0]  var1;
    rand bit [7:0]  var2;
    IpVersionType ipVersion;

    //Non-random variables that can be used to control constraints
    bit [15:0] minNumberOfPackets, maxNumberOfPackets;
    bit [15:0] minPacketLength, maxPacketLength;
    integer IPV4Weight, IPV6Weight;

    constraint cPacketLength {
        packetLength in { minPacketLength : maxPacketLength }
    }
    constraint cChannelNumber {
        channelNumber in {0:1}
    }
    constraint cIPVersionType {
        ipVersion dist { IPV4 := IPV4Weight, IPV6 := IPV6Weight, IPVX := (100 - IPV4Weight - IPV6Weight) }
    }
    //Probability of var1 being 1,2,3,4,5 in the ratio 1,2,4,4,4
    constraint cDist1 {
        var1 dist { 1 := 1, 2 := 2, [3:4] := 4 }
    }
    //Probability of var2 being 1,2,3,4,5 is in the ratio 1,2,4/3,4/3,4/3 
    constraint cDist2 {
        var2 dist { 1 := 1, 2 := 2, [3:5] :/ 4 }
    }       
    //Implication constraint - if(channelNum == i) then { ... }
    constraint cImplication {
        (channelNumber == 0) => {
            destAddress in {0:200};
            sourceAddress in {201:400};
        }
        (channelNumber == 1) => {
            destAddress in {201:400};
            sourceAddress in {0:200};
        }
    }
    //Controlling order of constraints solved using a constraint solver
    constraint order_solver {
        solver channelNumber before destAddress;
        solver channelNumber before sourceAddress;
    }

    function new();
        //Setting default min/max packets and min/max packet length
        minNumberOfPackets = 100;
        maxNumberOfPackets = 1000;
        minPacketLength = 128;
        maxPacketLength = 256;
        IPV4Weight = 50;
        IPV6Weight = 30;
    endfunction
endclass
person Subbdue    schedule 02.11.2012