SlideShare a Scribd company logo
1 of 53
Download to read offline
6. Синтезируемое
             подмножество Verilog

             Автоматизация проектирования
                 компьютерных систем

                  д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ
13.03.2011                e-mail: hahanova@mail.ru       1
Цель лекции и содержание
 Цель – изучить синтезируемы Verilog-
  конструкции и принципы их
  преобразования в схему
 План
   Этапы синтеза
   Синтезируемые конструкции в Verilog




    13.03.2011   д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   2
                      e-mail: hahanova@mail.ru
Этапы синтеза
                       RTL Description


                           Translation


                        Unoptimized
                        Intermediate
                        Representation


                      Logic Optimization

                                                        Library o f avaible
                     Technology Mapping                 gates, and leaf-level
Design Constraints                                      cells. (technology
                     and Optimization
                                                        library)

                     Optimized Gate-Level
                     Representation

     13.03.2011       д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                      3
                           e-mail: hahanova@mail.ru
Синтезируемые конструкции в Verilog
          Тип конструкции        Ключевое слово                     Примечания
                                    или описание
        Порты                input, inout, output
        Параметры            parameter               defparam поддерживается
                                                     #( ) и defparam поддерживаются только
                                                     на один уровень вниз
        Определение модуля module
        Сигналы и          wire, reg, tri           разрешены векторы
        переменные                                  не поддерживаются: trireg, wor, trior, wand,
                                                    triand, tri0, tri1, real
        События                                     не поддерживаются именные события
        Реализация           реализация модуля,     Например,
        компонентов          реализация вентильного mymux m1(out, i0, i1, s);
                             примитива              nand (out, a, b);
        Функции и задачи     function, task         Игнорируются временные параметры,
                                                    вызов системных задач и функций
        Поведенческое        always, if-then-else,  Initial игнорируется
        описание             case, casex, casez     Synplify: не поддерживается deassign, wait,
                                                    force, release
        Процедурные блоки    begin, end,            Разрешается использование
                             именные блоки, disable оператора disable для именных блоков
                             for
                             while                  должны содержать конструкции
        Циклы
                             forever                @(posedge clk) или (@(negedge clk)
                             repeat                  в Synplify
        Уровень data flow  assign
                                                 Информация о задержках игнорируется
        Вентильный уровень стандартные примитивы

   13.03.2011                    д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                              4
                                       e-mail: hahanova@mail.ru
Типы данных
 Integer и real рекомендуется использовать для построения тестов.
 reg или wire - для моделей реальной аппаратуры. В Verilog 2001
  вектора обоих типов данных могут быть использованы для
  знаковых и беззнаковых данных.
 Пример:
  reg [3:0] arb_priority;
  wire [31:0] arb_request;
  wire signed [8:0] arb_signed;  Поддерживаемые типы данных
                       Класс данных                    XST              Synplify
                                        wire, tri,                wire, tri,
                    Цепи (Net)          triand/wand, trior/wor
                                        supply0, supply1       supply1, supply0
                                        reg, integer           reg, integer
                    Регистры (Reqister)
                                                               time (64 bit reg)
       13.03.2011          д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                    5
                                e-mail: hahanova@mail.ru
1 Синтез комбинационной логики
 Может быть сгенерирована:
   Из вентильных моделей.
   Из data-flow моделей.
   Из процедурного оператора always
     • Все входы комбинационной функции должны
       быть указаны в списке чувствительности
     • При использовании операторов if или case,
       необходимо чтобы выходной сигнал получал
       значение при каждой возможной ситуации. При
       каждой итерации выполнения блока begin-end
       выходной сигнал должен обновлять свое
       значение.
     13.03.2011   д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   6
                       e-mail: hahanova@mail.ru
Оператор assign
Реализуется комбинационной логикой
                         assign out = (a & b) | c;
             c

             a                                                               out
             b
                              un1_out                           out

assign {c_out, sum} = a + b + c_in;                                 assign out=(s)? a: b;
                                        [0]
                                              sum
  a                                                             s
  b                  +        [1:0]
                                        [1]
                                                               b                   0
                                                                                        out
                                              c_out
c_in                                                           a                   1
                 sum_1[1:0]
       13.03.2011                     д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ     out     7
                                              e-mail: hahanova@mail.ru
Использование always
для комбинационной логики
      always @(a, b, c_in)
               {c_out, sum} = a + b + c_in;
                                                         [0]
                                                               sum
       a

       b                         +             [1:0]
                                                         [1]
                                                               c_out
     c_in
                         sum_1[1:0]
Допускается использование сокращенной записи описания всех
портов в списке чувствительности:
       always @(*)     // или always @*
                  {c_out, sum} = a + b + c_in;
   Данная конструкция генерирует схему, аналогичную
   предыдущей.
      13.03.2011         д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ          8
                              e-mail: hahanova@mail.ru
2 Синтез последовательностных
устройств
 В списке чувствительности always выполняется
  проверка только фронтов сигналов синхронизации
  clock, асинхроных сброса reset и установки preset.
  Проверяются только сигналы, непосредственно
  влияющие на изменение состояния.
 В операторе always условия reset и preset
  описываются первыми.
 Внутри блока begin-end условие синхронизации не
  описывается.
 Нельзя описывать в одном блоке комбинационную и
  последовательностые схемы.
 Для моделей последовательностных схем
  предпочтительнее использование неблокирующих
  операторов “<=”.
     13.03.2011     д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   9
                         e-mail: hahanova@mail.ru
Использование always
для последовательностной логики
 module flop
      (input C, D, output reg Q);
                                  C
  always @(posedge C)             D                            D Q     Q
      Q <= D;
  endmodule                                                    Q

 module flop1
    (input C, D, CLR,           C
     output reg Q);             D                               D Q        Q
  always @(negedge C, posedge CLR)                               R
       if (CLR) Q <= 1'b0;    CLR
       else     Q <= D;                                            Q
  endmodule

      13.03.2011        д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ               10
                             e-mail: hahanova@mail.ru
Триггер-защелка
 module flop
    (input Clk, D,             output reg Q);

  always @(Clk, D)
     if (Clk) Q <= D;
  endmodule                                    lat
                   D                         D
                                               Q               Q
                  Clk                        C

                                                Q

     13.03.2011         д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ       11
                             e-mail: hahanova@mail.ru
Шаблон последовательностного устройства с
асинхронными управляющими сигналами

always @(posedge A, negedge B, negedge C, … posedge Clock)
   if (A)                    //      A=1
         <statement>         //asychronous logic
   else if (!B)              //      B=0
         <statement>         //asynchronous logic
   else if (!C)              //      C=0
         <statement>         // asynchronous logic
   ...          //Любое количество конструкций else if
   else                      // posedge Clock
         <statement>          //synchronous logic


     13.03.2011      д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   12
                          e-mail: hahanova@mail.ru
Шаблон последовательностного устройства с
синхронными управляющими сигналами

always @(posedge Clock)
   if (A)                    //      A=1
         <statement>         //sychronous logic
   else if (!B)              //      B=0
         <statement>         //synchronous logic
   else if (!C)              //      C=0
         <statement>         //synchronous logic
   ...          //Любое количество конструкций else if
   else                      // posedge Clock
         <statement>          //synchronous logic

      13.03.2011       д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   13
                            e-mail: hahanova@mail.ru
Пример. Счетчик (1)
module AsynCounter
  #(parameter Num_bits = 2)
   (input Clk, Preset, UpDown, Clear,
    input [Num_bits-1:0] Data,
    output reg [Num_bits-1:0] Counter);

always @(posedge Clear, posedge Clk)
begin
   if (Clear) Counter <= 0;
   else if (Preset) Counter <= Data;
   else if (UpDown) Counter <= Counter + 1;
        else Counter <= Counter - 1;
        end
endmodule
      13.03.2011       д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   14
                            e-mail: hahanova@mail.ru
Пример. Счетчик (2)



     Clk
  Preset
UpDown                               [1:0]
                    11
                         0
                                     [1:0]
                                              +        [1:0]
                                                                [1:0]
                                                                        0
                                                                                    [1:0]                                 [1:0]
                             [1:0]                                          [1:0]
                                                                                            D[1:0]       Q[1:0]   [1:0]
                                                                                                                                  Counter[1:0]
                    01                                          [1:0]
                         1             un1_Counter[1:0]                 1                            R
                     un3[1:0]                                  Counter_7[1:0]
Data[1:0]
                                                                                            Counter[1:0]
            [1:0]
   Clear




               13.03.2011                         д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                                                      15
                                                       e-mail: hahanova@mail.ru
3 Особые ситуации синтеза
1. Использование блокирующих и
   неблокирующих операторов
2. Оператор IF
3. Оператор CASE
4. Комбинационная схема из CASE
5. Использование casez и casex
6. Параллельный CASE
7. Оператор цикла
8. Локальное использование переменных

    13.03.2011   д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   16
                      e-mail: hahanova@mail.ru
3.1 Блокирующие и неблокирующие
 операторы
  Не допускается использовать одновременно
  блокирующие и неблокирующие операторы для
  присвоения значений одному сигналу

 always @(in1)                      if (in2) begin
  begin                                     out1[0] = 1’b0;
                                            out1[1] <= in1;
     if (in2) out1 = in1;
                                      end
     else out1 <= in2;                else begin
  end                                       out1[0] = in2;
                                            out1[1] <= 1’b1;
                                      end

      13.03.2011     д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ      17
                          e-mail: hahanova@mail.ru
3.2 Оператор IF
module SelectOneOf
 (input [1:0] A, B, output reg [1:0] Z);
 always @(A, B)
     if (A>B)     Z=A;
     else         Z=B;
 endmodule
              [1:0]   [1:0]
   B[1:0]
              [1:0]   [1:0]
                              <
   A[1:0]                                          [1:0]
                                                            0
                              Z4                                     [1:0] [1:0]
                                                                                   Z[1:0]
                                                   [1:0]
                                                            1
                                                           Z[1:0]
       13.03.2011             д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                          18
                                   e-mail: hahanova@mail.ru
Появление триггера из оператора if
module SelectOneOf
   (input A, B, output reg Z);
   always @(A, B)
         if (A) Z=B;
endmodule

                              lat
        B        D
                                             Q              Z
        A        C


                               Z
    13.03.2011       д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ       19
                          e-mail: hahanova@mail.ru
3.3 Оператор CASE
 module ALU
   #(parameter ADD = 'b00, SUB = 'b01,
                 MUL = 'b10, DIV = 'b11)
   (input [1:2] Op, input [0:1] A, B,
    output reg [0:1] Z);

 always @(Op, A, B)
        case (Op)
               ADD : Z = A + B;
               SUB : Z = A - B;
               MUL : Z = A * B;
               DIV : Z = A / 2;
        endcase
 endmodule
    13.03.2011       д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   20
                          e-mail: hahanova@mail.ru
Результат синтеза оператора CASE
             [1:2]     [2]
   Op[1:2]                                [0:1]
                     [0:1]
                             0
             [0:1]   [0:1]
                                 [1:0]    [1:0]
                                                       +        [0:1]

    B[0:1]                   1
                     un1_B_1[1:0]                  un1_A[0:1]
             [0:1]
    A[0:1]


                                                                                [1]
                                                                                       e
                                                                              [0:1]
                       [2]                                                             d
                                            [1]
                        1                   [2]                                        e       [0:1] [0:1]
                             0                                                [0:1]                          Z[0:1]
                                                                                       d
                        0
                             1
                                             un1_Op_4                                  e
                                                                        =0
                                                                                       d
                      un1_Op[0]                                         [0]

                                                                                      Z[0:1]
                                          [0:1]

                                          [0:1]
                                                       *        [0:1]


                                                    Z_4[0:1]


                                            [2]
                                            [1]

                                             un1_Op_3
   13.03.2011                            д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                                         21
                                                  e-mail: hahanova@mail.ru
Триггер из CASE
                                                                    latrs
                                                              0
                                                                    D
                                                              0
                                            [0]                     C       [0]   [1:0]
                                                                      Q                   NextToggle[1:0]
                                    [1:0]   [1]                     R
                     Toggle[1:0]
                                                                    S
                                            NextToggle10
module NextStateLogic                                      NextToggle_1[0]

  (input [1:0] Toggle,
  output reg [1:0] NextToggle);             [1]
                                            [0]
                                                                    latrs
  always @(Toggle)                          NextToggle11
                                                              0
                                                              0
                                                                    D
                                                                    C       [1]
                                                                      Q
    case (Toggle)                                                   R
                                                                    S
     2'b01: NextToggle = 2'b10;                            NextToggle_1[1]
     2'b10: NextToggle = 2'b01;
    endcase
endmodule

       13.03.2011            д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                                    22
                                   e-mail: hahanova@mail.ru
3.4 Комбинационная схема из CASE

   always @(Toggle)
      case (Toggle)
           2'b01: NextToggle = 2'b10;
           2'b10: NextToggle = 2'b01;
           default: NextToggle = 2'b01;
                                    NextToggle[1:0]
      endcase

                        [0]
                [1:0]   [1]
Toggle[1:0]
                        NextToggle14
                                   un1_NextToggle14
         13.03.2011              д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   23
                                      e-mail: hahanova@mail.ru
FULL CASE

always @(Toggle)
   case (Toggle)       //synthesis full_case
        2'b01: NextToggle = 2'b10;
        2'b10: NextToggle = 2'b01;
   endcase                   NextToggle[1:0]
                                                  [1]




                     [1:0]   [1]
       Toggle[1:0]

                             un1_Toggle[1]
  13.03.2011                 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   24
                                   e-mail: hahanova@mail.ru
3.5 Использование casez
 module Casez_Ex
      (input [0:3] Pr_Counter,
      output reg [0:1] DoCommand);

  always @(Pr_Counter)
      casez(Pr_Counter)
            4’b???1 : DoCommand = 0;
            4’b??10 : DoCommand = 1;
            4’b?100 : DoCommand = 2;
            4’b1000 : DoCommand = 3;
            default : DoCommand = 3;
      endcase
  endmodule
     13.03.2011      д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   25
                          e-mail: hahanova@mail.ru
Результат синтеза casez
                                                                               DoCommand[0:1]




                           [2]
                  [0:3]    [3]
Pr_Counter[0:3]                           [3]

                     DoCommand23[0]
                                 un1_DoCommand23_1
                                             un1_DoCommand23_2


                           [0]
                           [3]                                [3]
                                                                    e
                           [2]                                 0
                                                                    d
                           [1]
                                                                    e
                          DoCommand25                          1
                                                                    d
                                                                    e
                                                               0
                                                                    d
                                                                    e
                                                               1
                                                                    d
                           [1]                                      e
                                                               1
                           [3]            [3]                       d
                           [2]
                                 un1_DoCommand25_1
                                              DoCommand_1[1]
                     DoCommand24[0]
              13.03.2011                д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ               26
                                                e-mail: hahanova@mail.ru
Использование casex
module PriorityLogic
 (input [2:0] Toggle, output reg [2:0] NextToggle);
 always @(Toggle)
     casex (Toggle)
            3'bxx1: NextToggle = 3'b010;
            3'bx1x: NextToggle = 3'b110;
            3'b1xx: NextToggle = 3'b001;
            default: NextToggle = 3'b000;
     endcase
 endmodule
     13.03.2011     д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   27
                         e-mail: hahanova@mail.ru
Результат синтеза casex
                                                                        NextToggle[2:0]




                                          [1]
                                          [0]

                                         NextToggle19


                                          [2]
                        [0]
                [2:0]   [1]
Toggle[2:0]
                        un1_Toggle_1     NextToggle20




        13.03.2011               д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                     28
                                       e-mail: hahanova@mail.ru
3.6 Параллельный CASE
module ParallelCase
   (input [2:0] Toggle; output reg [2:0] NextToggle);
always @(Toggle)
        casex (Toggle)            // synthesis parallel_case
                 3'bxx1: NextToggle = 3'b010;
                 3'bx1x: NextToggle = 3'b110;
                 3'b1xx: NextToggle = 3'b001;
                 default: NextToggle = 3'b000;
                                                 [1]
        endcase                                           NextToggle[2:0]
   endmodule                                     [2]




                                      [1]
                              [2:0]   [0]
                Toggle[2:0]
                                      un1_Toggle
         13.03.2011              д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ       29
                                      e-mail: hahanova@mail.ru
Использование неконстантных выражений
 выбора
module Encoder
  (input [0:3] Bus; output reg [0:1] Address);
always @(Bus)
  casez(1'b1)              //synthesis full_case
      Bus[0] : Address = 2'b00;
      Bus[1] : Address = 2'b01;
      Bus[2] : Address = 2'b10;
      Bus[3] : Address = 2'b11;
  endcase
endmodule
       13.03.2011      д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   30
                            e-mail: hahanova@mail.ru
Результат синтеза
                                                                              Address[0:1]




                                               [1]
                                               [0]

                                                Address19
                                                                [0]
                                                                      e
                                                                 0
                                                                      d
                                                                      e
                                                                 1
                                                                      d
                                               [2]
                   [0]
                                                                      e
           [0:3]   [1]                                           0
Bus[0:3]                                                              d
                   un1_Bus_1   un1_Bus_2        Address20             e
                                                                 1
                                                                      d

                                                               Address_1[1]

                                               [3]

                               [2]

                               un1_Bus_3        Address21

            13.03.2011               д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                31
                                           e-mail: hahanova@mail.ru
3.7 Оператор цикла (1)
module Multiplexer                                                    Line[3:0]


   (input [1:0] Address,
   output reg [3:0] Line);       Address[1:0]
                                                [1:0]
                                                        [0]
                                                        [1]

                                                         _l0.Line19

    integer J;
always @(Address)                                       [1]
                                                        [0]


    for (J = 3; J >= 0; J=J-1)                           _l1.Line44

    if (Address == J)
            Line[J] = 1;                                [0]
                                                        [1]


    else                                                 _l2.Line69

            Line[J] = 0;
endmodule
                                                        [0]
                                                        [1]

                                                         _l3.Line90

     13.03.2011       д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                 32
                           e-mail: hahanova@mail.ru
[1]
                                             xin1[1:8]                                   [1:8]
                                                         [1:8]   [1]                             xout[1:8]
                                             xin2[1:8]


Оператор цикла (2)
                                                                                   [1]
                                                         [1:8]
                                                                       xout_1[1]


                                                                 [2]
                                                                 [2]               [2]

                                                                       xout_1[2]
module synXor8
                                                                 [3]


 (output reg [1:8] xout,                                         [3]

                                                                       xout_1[3]
                                                                                   [3]




  input [1:8] xin1, xin2);                                       [4]
                                                                 [4]               [4]

                                                                       xout_1[4]



reg [1:8] i;                                                     [5]
                                                                 [5]               [5]

                                                                       xout_1[5]

always @(*)                                                      [6]



  for (i = 1; i <= 8; i = i + 1)
                                                                 [6]               [6]

                                                                       xout_1[6]


  xout[i] = xin1[i] ^ xin2[i];                                   [7]
                                                                 [7]               [7]

                                                                       xout_1[7]
endmodule
   13.03.2011       д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ         [8]
                                                                 [8]                                         33
                                                                                   [8]
                         e-mail: hahanova@mail.ru                      xout_1[8]
3.8 Локальное использование переменных

module GlobalReg
  (input Clk, input [3:0] State, output reg [3:0] NextState);

   reg [3:0] Temp;

always @(negedge Clk)
   begin
        Temp = State;
        NextState <= Temp;
   end
endmodule
       Clk
                   [3:0]   [3:0]                              [3:0] [3:0]
State[3:0]                          D[3:0]      Q[3:0]                      NextState[3:0]

                                   NextState[3:0]
      13.03.2011                   д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                      34
                                        e-mail: hahanova@mail.ru
3.8 Локальное использование переменных

module GlobalReg
   (input Clk; input [3:0] State; output reg [3:0] NextState);
   reg [3:0] Temp;
always @(negedge Clk)
   begin
        NextState <= Temp;
        Temp = State;
   end
endmodule

        Clk
                 [3:0]   [3:0]                      [3:0]   [3:0]                      [3:0] [3:0]
 State[3:0]                      D[3:0]   Q[3:0]                     D[3:0]   Q[3:0]                 NextState[3:0]

                                 Temp[3:0]                          NextState[3:0]
              13.03.2011                     д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                                     35
                                                   e-mail: hahanova@mail.ru
Блокирующие и неблокирующие
 операторы
module FlagBits
  (input ClockB, Strobe, Xflag, Mask,
  output reg RightShift, SelectFirst, CheckStop);

always @(negedge ClockB)
   begin
          RightShift = RightShift ^ Strobe;
          SelectFirst <= RightShift | Xflag;
          CheckStop <= SelectFirst ^ Mask;
   end
endmodule
      Strobe


                                                                                            D Q       CheckStop
      ClockB                                                     D Q
                     D Q
                                              SelectFirst_2   SelectFirst   CheckStop_2   CheckStop
                 RightShift   RightShift_2
                                                                                                      SelectFirst
                                                                                                      RightShift
       Xflag
       Mask

        13.03.2011                    д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                                  36
                                             e-mail: hahanova@mail.ru
Неблокирующие операторы
module FlagBits
   (input ClockB, Strobe, Xflag, Mask;
   output reg RightShift, SelectFirst, CheckStop);
always @(negedge ClockB)
   begin
        RightShift <= RightShift ^ Strobe;
        SelectFirst <= RightShift | Xflag;
        CheckStop <= SelectFirst ^ Mask;
   end
endmodule
  Xflag
ClockB

                                                                                    D Q       CheckStop
Strobe                                                   D Q
                           D Q
                                      SelectFirst_2   SelectFirst   CheckStop_2   CheckStop
          RightShift_2   RightShift                                                           SelectFirst

 Mask
                                                                                              RightShift


          13.03.2011                  д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                           37
                                            e-mail: hahanova@mail.ru
Неблокирующие операторы
module NonBlockingExample
  (input Clk, Merge, ER, Xmit, FDDI, output reg Claim);

   reg FCR;
always @(posedge Clk)
   begin
         FCR<=ER|Xmit;
         if(Merge) Claim <= FCR & FDDI;
         else     Claim <= FDDI;
   end
endmodule
Merge
  Clk
                                                           0
                                                                    D Q     Claim
  ER                                                       1
                          D Q
 Xmit                                                               Claim
                                        Claim_2         Claim_5
             FCR_2        FCR
FDDI
        13.03.2011           д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ             38
                                  e-mail: hahanova@mail.ru
Блокирующие операторы
   module NonBlockingExample
        (input Clk, Merge, ER, Xmit, FDDI, output reg Claim);
        reg FCR;
    always @(posedge Clk)
         begin
                FCR = ER|Xmit;
                if(Merge)
                         Claim = FCR & FDDI;
                else
                         Claim = FDDI;
         end
    endmodule
 FDDI
Merge
  Clk
                                                   0
                                                                    D Q     Claim
  ER                                               1
 Xmit                                                               Claim
                            Claim_2            Claim_5
                FCR_2
        13.03.2011           д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ               39
                                  e-mail: hahanova@mail.ru
Диапазон векторов
 module PartSelect
     (input[3:0] A, C, output [3:0] ZCat);

  assign ZCat [2:0] = {A[2], C[3:2]};
                                                                     ZCat[3:0]
  endmodule        A[3:0]
                              [3:0]
                              [3:0]
                                                               [2]
                                                             [3:2]
                   C[3:0]


                                      0

                                      0


                                          ZCat_1

      13.03.2011            д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                 40
                                  e-mail: hahanova@mail.ru
Константный индекс
module ConstantIndex
  (input[3:0] A, C, RegFile, output [3:0] ZCat);

assign ZCat [2:0] ={A[2], C[3:2]};

assign ZCat[0] = RegFile[3];        [3:0]                                [2]
                                                                               ZCat[3:0]

endmodule     A[3:0]
                                                                       [3:2]

                                    [3:0]
                      C[3:0]

                                                      0

                                                      0

                                              [2]
                 RegFile[3:0]                             ZCat_1
                                              [2:0]

    13.03.2011                  д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                       41
                                     e-mail: hahanova@mail.ru
Переменная в качестве индекса
 module NonComputeRight
                                                           [0]
                                                   [1:0]   [1]
                                      Index[1:0]
                                                           un1_Index_3
     (input[3:0] Data,
     input [1:0] Index,                                                        e
     output Dout);                                         [0]
                                                           [1]
                                                                         [0]
                                                                               d
                                                                               e
                                                                         [1]
                                                                               d
                                                                                      Dout
                                                           un1_Index_4         e
  assign Dout = Data [Index];
                                                                         [2]
                                                                               d
                                                                               e
                                                   [3:0]                 [3]
                                       Data[3:0]                               d

                                                                               Dout
                                                           [1]

endmodule                                                  [0]

                                                           un1_Index_5


                                                           [0]
                                                           [1]

                                                           un1_Index_2


      13.03.2011      д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                            42
                           e-mail: hahanova@mail.ru
Синтез подпрограмм: Функции
 module comb15
   (input [3:0] A, B, input CIN, output [3:0] S, output COUT);

    wire [1:0] S0, S1, S2, S3;
    function signed [1:0] ADD (input A, B, CIN);
      reg S, COUT;
    begin
      S = A ^ B ^ CIN;
      COUT = (A&B) | (A&CIN) | (B&CIN);
      ADD = {COUT, S};
    end
 endfunction

 assign S0 = ADD (A[0], B[0], CIN),
      S1 = ADD (A[1], B[1], S0[1]),
      S2 = ADD (A[2], B[2], S1[1]),
      S3 = ADD (A[3], B[3], S2[1]),
      S = {S3[0], S2[0], S1[0], S0[0]},
      COUT = S3[1];
 endmodule
     13.03.2011               д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   43
                                   e-mail: hahanova@mail.ru
Результат синтеза функции
                                                                                                                                                    [0]
                                                                                                                                                                S[3:0]
                                                                                                                                                    [0]
                                                                                                                                                    [0]
                                                                                                                                                    [0]


                                                                                                                            [3]
                                                                                                                            [3]               [0]         [1]
                                                                                                             [3]                                                COUT
                                                                                [2]                                         [1]
                                                 [1]                                                         [3]
         [3:0]     [0]                                                          [2]
A[3:0]
B[3:0]
         [3:0]     [0]
                                                 [1]
                                                                                                          ADD_3.un16_COUT          ADD[0]
                                               ADD_1.un6_COUT                ADD_2.un11_COUT
                 ADD_0.un1_COUT



                                                                                                             [3]
                                                                                [2]                                                         [1]
                                                 [1]                                                [1]      [1]
                   [0]                                                 [1]      [1]
                                         [1]     [1]
  CIN
                                               ADD_1.un7_COUT                ADD_2.un12_COUT ADD_10[1] ADD_3.un17_COUT            ADD[1]
                 ADD_0.un2_COUT   ADD_4[1]                      ADD_7[1]




                                                                                                             [3]
                                                                                [2]                                         [2]
                                                 [1]                                                         [1]
                   [0]                                                          [1]                                         [2]               [0]
                                                 [1]

                                                                             ADD_2.un13_COUT              ADD_3.un18_COUT   [1]

                 ADD_0.un3_COUT                ADD_1.un8_COUT                                                                 ADD_10[0]



                                                                                                                            [1]
                                                                                                                            [1]               [0]
                                                                                                                            [1]

                                                                                                                                  ADD_7[0]



                                                                                                                            [0]
                                                                                                                            [0]               [0]



                                                                                                                                  ADD_4[0]



                         13.03.2011                             д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                                                               44
                                                                     e-mail: hahanova@mail.ru
Синтез подпрограмм: Задачи
module EXAMPLE
   (input [3:0] A, B, input CIN, output reg [3:0] S, output reg COUT);

    reg [1:0] S0, S1, S2, S3;
    task ADD (input A, B, CIN, output reg [1:0] C);
            reg S, COUT;
            begin
               S = A ^ B ^ CIN;                                                                                                                       [0]
                                                                                                                                                      [0]            [0]   [3:0]
                                                                                                                                                                                   S[3:0]

               COUT = (A&B) | (A&CIN) | (B&CIN);                                                                                                            S_1[0]

               C = {COUT, S};                                                                                                                         [1]


            end                                                                                                                                       [1]            [1]




    endtask
                                                                                                                                                            S_1[1]



always @(A, B, CIN)                                                                                                                                   [2]
                                                                                                                                                      [2]            [2]



begin                                                                                                                                                       S_1[2]


    ADD (A[0], B[0], CIN, S0);                                                                                                                        [3]



    ADD (A[1], B[1], S0[1], S1);
                                                                                                                                                      [3]            [3]
                                                                                                                                       [3]
                                                                                                             [2]
                                                                                   [1]                                                 [3]
                                                [3:0]     [0]                                                [2]
                                       A[3:0]                                      [1]
                                       B[3:0]   [3:0]     [0]
                                                                                                                                    ADD_3.un16_COUT         S_1[3]

    ADD (A[2], B[2], S1[1], S2);                        ADD_0.un1_COUT           ADD_1.un6_COUT           ADD_2.un11_COUT



    ADD (A[3], B[3], S2[1], S3);                                                                             [2]
                                                                                                                                       [3]


    S = {S3[0], S2[0], S1[0], S0[0]};
                                                                                   [1]                                                                                             COUT
                                                          [0]

                                         CIN                                                              ADD_2.un12_COUT           ADD_3.un17_COUT         S3[1]
                                                                                 ADD_1.un7_COUT                             S2[1]
    COUT = S3[1];
                                                        ADD_0.un2_COUT   S0[1]                    S1[1]



end                                                       [0]
                                                                                   [1]
                                                                                                             [2]
                                                                                                                                       [3]




endmodule                                               ADD_0.un3_COUT           ADD_1.un8_COUT           ADD_2.un13_COUT           ADD_3.un18_COUT




          13.03.2011                  д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ                                                                                          45
                                                e-mail: hahanova@mail.ru
Assign and Deassign Statements
       Не синтезируется Synplify
module assig
       (input RST, SELECT, CLOCK, input [0:3] DATA_IN,
        output reg [0:3] STATE);
  always @ (RST)
       if(RST) assign STATE = 4'b0;
       else    deassign STATE;

   always @ (posedge CLOCK) Результат синтеза модуля assig в XST
        STATE = DATA_IN;
endmodule




       13.03.2011         д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   46
                               e-mail: hahanova@mail.ru
Контрольные вопросы 1
 Сколько триггеров будет сгенерировано,
  если допустить, что каждая переменная
  соответствует одному биту?
  always @(posedge C)
  begin
    A1 = A&B;
    A2 <= A1^D;
  end

    13.03.2011   д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   47
                      e-mail: hahanova@mail.ru
Контрольные вопросы 2
 Будет ли сгенерирован триггер из следующего
  кода? Если да, то сколько и какой/какие?
     always @(D, EС)
      begin: Design
       integer Tmp;
         if (EС)
           begin
             Q <= Tmp;
             Tmp = D;
        end
     end


     13.03.2011          д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   48
                              e-mail: hahanova@mail.ru
Контрольные вопросы 3
 Какая логика будет сгенерирована для
  следующего кода?
  reg [3:0] OUT;
  wire [3:0] Shift, N;
  always @(posedge CLK)
   begin
     OUT <= Shift >> N;
   end

    13.03.2011   д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   49
                      e-mail: hahanova@mail.ru
Контрольные вопросы 4
 Будут ли сгенерированы триггер или
  триггеры для следующего кода?
  always @(Sel)
   case (Sel) // synthesis full_case
    2’b01: Q <= 2’b10;
    2’b10: Q <= 2’b01;
   endcase


     13.03.2011    д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   50
                        e-mail: hahanova@mail.ru
Контрольные вопросы 5
 Какая логика генерируется из следующего
  кода?
  wire A1, A2;
  reg Q;
  always
   begin
    wait (A1);
    #10 Q <= A2;
   end


     13.03.2011    д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   51
                        e-mail: hahanova@mail.ru
Контрольные вопросы 6
 Следующий код является моделью двух
  регистров. Результаты моделирования после
  синтеза не совпали с функциональным
  моделирования. Почему?
    always @(posedge CLK)
     begin
      if (EN) R1 = D1;
      else R1 = R2;
     end
    always @(posedge CLK)
     begin
      if (EN) R2 = D2;
      else R2 = R1;
     end
    13.03.2011       д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   52
                          e-mail: hahanova@mail.ru
Контрольные вопросы 7
 Результаты моделирования после
  синтеза не совпали с результатами
  функционального моделирования.
  Почему?
         always @(A)
          C <= A | B;




    13.03.2011          д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ   53
                             e-mail: hahanova@mail.ru

More Related Content

What's hot

Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...
Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...
Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...Nikolay Grebenshikov
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииUnguryan Vitaliy
 
Лекция №1. Введение. Предмет "Теория вычислительных процессов"
Лекция №1. Введение. Предмет "Теория вычислительных процессов"Лекция №1. Введение. Предмет "Теория вычислительных процессов"
Лекция №1. Введение. Предмет "Теория вычислительных процессов"Nikolay Grebenshikov
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
 
апкс 2011 05_verilog
апкс 2011 05_verilogапкс 2011 05_verilog
апкс 2011 05_verilogIrina Hahanova
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
Типы данных
Типы данныхТипы данных
Типы данныхMonsterXX
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4Technopark
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияYandex
 
Типы данных (продолжение). Операторы. Стандартные библиотеки
Типы данных (продолжение). Операторы. Стандартные библиотекиТипы данных (продолжение). Операторы. Стандартные библиотеки
Типы данных (продолжение). Операторы. Стандартные библиотекиIhor Porotikov
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Stfalcon Meetups
 
Functional Programing
Functional ProgramingFunctional Programing
Functional ProgramingMax Arshinov
 
Алгоритмы на ruby: жадные алгоритмы
Алгоритмы на ruby: жадные алгоритмыАлгоритмы на ruby: жадные алгоритмы
Алгоритмы на ruby: жадные алгоритмыEvgeny Smirnov
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.Unguryan Vitaliy
 

What's hot (20)

Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...
Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...
Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...
 
Урок 6. Чистое лямбда-исчисление.
Урок 6. Чистое лямбда-исчисление. Урок 6. Чистое лямбда-исчисление.
Урок 6. Чистое лямбда-исчисление.
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операции
 
java 8
java 8java 8
java 8
 
Лекция №1. Введение. Предмет "Теория вычислительных процессов"
Лекция №1. Введение. Предмет "Теория вычислительных процессов"Лекция №1. Введение. Предмет "Теория вычислительных процессов"
Лекция №1. Введение. Предмет "Теория вычислительных процессов"
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
 
апкс 2011 05_verilog
апкс 2011 05_verilogапкс 2011 05_verilog
апкс 2011 05_verilog
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Типы данных
Типы данныхТипы данных
Типы данных
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Типы данных (продолжение). Операторы. Стандартные библиотеки
Типы данных (продолжение). Операторы. Стандартные библиотекиТипы данных (продолжение). Операторы. Стандартные библиотеки
Типы данных (продолжение). Операторы. Стандартные библиотеки
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
Урок 1. Что такое функциональное программирование
Урок 1. Что такое функциональное программированиеУрок 1. Что такое функциональное программирование
Урок 1. Что такое функциональное программирование
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
 
Java. Методы
Java. Методы Java. Методы
Java. Методы
 
Functional Programing
Functional ProgramingFunctional Programing
Functional Programing
 
Алгоритмы на ruby: жадные алгоритмы
Алгоритмы на ruby: жадные алгоритмыАлгоритмы на ruby: жадные алгоритмы
Алгоритмы на ruby: жадные алгоритмы
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
 
Тодуа. Методы разработки интерпретатора языка Рефал-2
Тодуа. Методы разработки интерпретатора языка Рефал-2Тодуа. Методы разработки интерпретатора языка Рефал-2
Тодуа. Методы разработки интерпретатора языка Рефал-2
 

Viewers also liked

2011 general research
2011 general research2011 general research
2011 general research000175031
 
Bai4 oxitaxitl2
Bai4 oxitaxitl2Bai4 oxitaxitl2
Bai4 oxitaxitl2vjt_chjen
 
Ies lamola miguel y esther
Ies lamola miguel y estherIes lamola miguel y esther
Ies lamola miguel y estheriesMola
 
Survey questionnaire
Survey questionnaireSurvey questionnaire
Survey questionnaireTenori Nikki
 
Riding the Age Wave: Will Your Club Sink or Swim?
Riding the Age Wave: Will Your Club Sink or Swim?Riding the Age Wave: Will Your Club Sink or Swim?
Riding the Age Wave: Will Your Club Sink or Swim?theGrapevine411
 
Francisco pizaro and the inca conquest rev 1
Francisco pizaro and the inca conquest rev 1Francisco pizaro and the inca conquest rev 1
Francisco pizaro and the inca conquest rev 1000175031
 
Cacdinhluat(phan2)
Cacdinhluat(phan2)Cacdinhluat(phan2)
Cacdinhluat(phan2)vjt_chjen
 
What is this DI and AOP stuff anyway...
What is this DI and AOP stuff anyway...What is this DI and AOP stuff anyway...
What is this DI and AOP stuff anyway...Richard McIntyre
 
I avm& avmdefirsat.com tanıtım
I avm& avmdefirsat.com tanıtımI avm& avmdefirsat.com tanıtım
I avm& avmdefirsat.com tanıtımykeremyazici74
 
Economic survey of india
Economic survey of indiaEconomic survey of india
Economic survey of indiaGaurav Sinha
 

Viewers also liked (20)

Landscape
LandscapeLandscape
Landscape
 
Black history
Black historyBlack history
Black history
 
2011 general research
2011 general research2011 general research
2011 general research
 
Shefali company's profile 1
Shefali  company's profile 1Shefali  company's profile 1
Shefali company's profile 1
 
Presentacion
PresentacionPresentacion
Presentacion
 
Gvvv quiz part 3
Gvvv quiz part 3Gvvv quiz part 3
Gvvv quiz part 3
 
Credit cards
Credit cardsCredit cards
Credit cards
 
Profes mova med
Profes mova medProfes mova med
Profes mova med
 
Ttt
TttTtt
Ttt
 
Bai4 oxitaxitl2
Bai4 oxitaxitl2Bai4 oxitaxitl2
Bai4 oxitaxitl2
 
Yntercaran
YntercaranYntercaran
Yntercaran
 
Bio magz
Bio magzBio magz
Bio magz
 
Ies lamola miguel y esther
Ies lamola miguel y estherIes lamola miguel y esther
Ies lamola miguel y esther
 
Survey questionnaire
Survey questionnaireSurvey questionnaire
Survey questionnaire
 
Riding the Age Wave: Will Your Club Sink or Swim?
Riding the Age Wave: Will Your Club Sink or Swim?Riding the Age Wave: Will Your Club Sink or Swim?
Riding the Age Wave: Will Your Club Sink or Swim?
 
Francisco pizaro and the inca conquest rev 1
Francisco pizaro and the inca conquest rev 1Francisco pizaro and the inca conquest rev 1
Francisco pizaro and the inca conquest rev 1
 
Cacdinhluat(phan2)
Cacdinhluat(phan2)Cacdinhluat(phan2)
Cacdinhluat(phan2)
 
What is this DI and AOP stuff anyway...
What is this DI and AOP stuff anyway...What is this DI and AOP stuff anyway...
What is this DI and AOP stuff anyway...
 
I avm& avmdefirsat.com tanıtım
I avm& avmdefirsat.com tanıtımI avm& avmdefirsat.com tanıtım
I avm& avmdefirsat.com tanıtım
 
Economic survey of india
Economic survey of indiaEconomic survey of india
Economic survey of india
 

Similar to апкс 2011 07_синтез_verilog

апкс 2011 04_verilog_продолж
апкс 2011 04_verilog_продолжапкс 2011 04_verilog_продолж
апкс 2011 04_verilog_продолжIrina Hahanova
 
цсноп 2 11_3_проект памяти
цсноп 2 11_3_проект памятицсноп 2 11_3_проект памяти
цсноп 2 11_3_проект памятиIrina Hahanova
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Alex Ott
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture libraryMERA_school
 
CiklumCPPSat: Ivan Romanenko "Experience of work with Boost Spirit"
CiklumCPPSat: Ivan Romanenko "Experience of work with Boost Spirit"CiklumCPPSat: Ivan Romanenko "Experience of work with Boost Spirit"
CiklumCPPSat: Ivan Romanenko "Experience of work with Boost Spirit"Ciklum Ukraine
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Technopark
 
апкс 2011 04_verilog
апкс 2011 04_verilogапкс 2011 04_verilog
апкс 2011 04_verilogIrina Hahanova
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Javametaform
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksMikhail Kurnosov
 

Similar to апкс 2011 07_синтез_verilog (10)

апкс 2011 04_verilog_продолж
апкс 2011 04_verilog_продолжапкс 2011 04_verilog_продолж
апкс 2011 04_verilog_продолж
 
цсноп 2 11_3_проект памяти
цсноп 2 11_3_проект памятицсноп 2 11_3_проект памяти
цсноп 2 11_3_проект памяти
 
Programming c++ (begin-if-else)
Programming c++ (begin-if-else)Programming c++ (begin-if-else)
Programming c++ (begin-if-else)
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture library
 
CiklumCPPSat: Ivan Romanenko "Experience of work with Boost Spirit"
CiklumCPPSat: Ivan Romanenko "Experience of work with Boost Spirit"CiklumCPPSat: Ivan Romanenko "Experience of work with Boost Spirit"
CiklumCPPSat: Ivan Romanenko "Experience of work with Boost Spirit"
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
 
апкс 2011 04_verilog
апкс 2011 04_verilogапкс 2011 04_verilog
апкс 2011 04_verilog
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Java
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 

More from Irina Hahanova

апкс 2011 08_verilog_макросы
апкс 2011 08_verilog_макросыапкс 2011 08_verilog_макросы
апкс 2011 08_verilog_макросыIrina Hahanova
 
цсноп 2 11_4_архитектуры памяти
цсноп 2 11_4_архитектуры памятицсноп 2 11_4_архитектуры памяти
цсноп 2 11_4_архитектуры памятиIrina Hahanova
 
цсноп 2 11_1_vital
цсноп 2 11_1_vitalцсноп 2 11_1_vital
цсноп 2 11_1_vitalIrina Hahanova
 
апкс 2011 06_проектирование арифметических устройств
апкс 2011 06_проектирование арифметических устройствапкс 2011 06_проектирование арифметических устройств
апкс 2011 06_проектирование арифметических устройствIrina Hahanova
 
апкс 2011 03_verilog
апкс 2011 03_verilogапкс 2011 03_verilog
апкс 2011 03_verilogIrina Hahanova
 
апкс 2011 01_введение
апкс 2011 01_введениеапкс 2011 01_введение
апкс 2011 01_введениеIrina Hahanova
 
моап 2011 02_active_1
моап 2011 02_active_1моап 2011 02_active_1
моап 2011 02_active_1Irina Hahanova
 
моап 2011 01_введение
моап 2011 01_введениемоап 2011 01_введение
моап 2011 01_введениеIrina Hahanova
 

More from Irina Hahanova (11)

апкс 2011 08_verilog_макросы
апкс 2011 08_verilog_макросыапкс 2011 08_verilog_макросы
апкс 2011 08_verilog_макросы
 
цсноп 2 11_4_архитектуры памяти
цсноп 2 11_4_архитектуры памятицсноп 2 11_4_архитектуры памяти
цсноп 2 11_4_архитектуры памяти
 
цсноп 2 11_1_vital
цсноп 2 11_1_vitalцсноп 2 11_1_vital
цсноп 2 11_1_vital
 
апкс 2011 06_проектирование арифметических устройств
апкс 2011 06_проектирование арифметических устройствапкс 2011 06_проектирование арифметических устройств
апкс 2011 06_проектирование арифметических устройств
 
апкс 2011 03_verilog
апкс 2011 03_verilogапкс 2011 03_verilog
апкс 2011 03_verilog
 
апкс 2011 01_введение
апкс 2011 01_введениеапкс 2011 01_введение
апкс 2011 01_введение
 
моап 2011 05
моап 2011 05моап 2011 05
моап 2011 05
 
моап 2011 04
моап 2011 04моап 2011 04
моап 2011 04
 
моап 2011 03
моап 2011 03моап 2011 03
моап 2011 03
 
моап 2011 02_active_1
моап 2011 02_active_1моап 2011 02_active_1
моап 2011 02_active_1
 
моап 2011 01_введение
моап 2011 01_введениемоап 2011 01_введение
моап 2011 01_введение
 

апкс 2011 07_синтез_verilog

  • 1. 6. Синтезируемое подмножество Verilog Автоматизация проектирования компьютерных систем д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 13.03.2011 e-mail: hahanova@mail.ru 1
  • 2. Цель лекции и содержание  Цель – изучить синтезируемы Verilog- конструкции и принципы их преобразования в схему  План  Этапы синтеза  Синтезируемые конструкции в Verilog 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 2 e-mail: hahanova@mail.ru
  • 3. Этапы синтеза RTL Description Translation Unoptimized Intermediate Representation Logic Optimization Library o f avaible Technology Mapping gates, and leaf-level Design Constraints cells. (technology and Optimization library) Optimized Gate-Level Representation 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 3 e-mail: hahanova@mail.ru
  • 4. Синтезируемые конструкции в Verilog Тип конструкции Ключевое слово Примечания или описание Порты input, inout, output Параметры parameter defparam поддерживается #( ) и defparam поддерживаются только на один уровень вниз Определение модуля module Сигналы и wire, reg, tri разрешены векторы переменные не поддерживаются: trireg, wor, trior, wand, triand, tri0, tri1, real События не поддерживаются именные события Реализация реализация модуля, Например, компонентов реализация вентильного mymux m1(out, i0, i1, s); примитива nand (out, a, b); Функции и задачи function, task Игнорируются временные параметры, вызов системных задач и функций Поведенческое always, if-then-else, Initial игнорируется описание case, casex, casez Synplify: не поддерживается deassign, wait, force, release Процедурные блоки begin, end, Разрешается использование именные блоки, disable оператора disable для именных блоков for while должны содержать конструкции Циклы forever @(posedge clk) или (@(negedge clk) repeat в Synplify Уровень data flow assign Информация о задержках игнорируется Вентильный уровень стандартные примитивы 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 4 e-mail: hahanova@mail.ru
  • 5. Типы данных  Integer и real рекомендуется использовать для построения тестов.  reg или wire - для моделей реальной аппаратуры. В Verilog 2001 вектора обоих типов данных могут быть использованы для знаковых и беззнаковых данных.  Пример: reg [3:0] arb_priority; wire [31:0] arb_request; wire signed [8:0] arb_signed; Поддерживаемые типы данных Класс данных XST Synplify wire, tri, wire, tri, Цепи (Net) triand/wand, trior/wor supply0, supply1 supply1, supply0 reg, integer reg, integer Регистры (Reqister) time (64 bit reg) 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 5 e-mail: hahanova@mail.ru
  • 6. 1 Синтез комбинационной логики  Может быть сгенерирована:  Из вентильных моделей.  Из data-flow моделей.  Из процедурного оператора always • Все входы комбинационной функции должны быть указаны в списке чувствительности • При использовании операторов if или case, необходимо чтобы выходной сигнал получал значение при каждой возможной ситуации. При каждой итерации выполнения блока begin-end выходной сигнал должен обновлять свое значение. 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 6 e-mail: hahanova@mail.ru
  • 7. Оператор assign Реализуется комбинационной логикой assign out = (a & b) | c; c a out b un1_out out assign {c_out, sum} = a + b + c_in; assign out=(s)? a: b; [0] sum a s b + [1:0] [1] b 0 out c_out c_in a 1 sum_1[1:0] 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ out 7 e-mail: hahanova@mail.ru
  • 8. Использование always для комбинационной логики always @(a, b, c_in) {c_out, sum} = a + b + c_in; [0] sum a b + [1:0] [1] c_out c_in sum_1[1:0] Допускается использование сокращенной записи описания всех портов в списке чувствительности: always @(*) // или always @* {c_out, sum} = a + b + c_in; Данная конструкция генерирует схему, аналогичную предыдущей. 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 8 e-mail: hahanova@mail.ru
  • 9. 2 Синтез последовательностных устройств  В списке чувствительности always выполняется проверка только фронтов сигналов синхронизации clock, асинхроных сброса reset и установки preset. Проверяются только сигналы, непосредственно влияющие на изменение состояния.  В операторе always условия reset и preset описываются первыми.  Внутри блока begin-end условие синхронизации не описывается.  Нельзя описывать в одном блоке комбинационную и последовательностые схемы.  Для моделей последовательностных схем предпочтительнее использование неблокирующих операторов “<=”. 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 9 e-mail: hahanova@mail.ru
  • 10. Использование always для последовательностной логики  module flop (input C, D, output reg Q); C always @(posedge C) D D Q Q Q <= D; endmodule Q  module flop1 (input C, D, CLR, C output reg Q); D D Q Q always @(negedge C, posedge CLR) R if (CLR) Q <= 1'b0; CLR else Q <= D; Q endmodule 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 10 e-mail: hahanova@mail.ru
  • 11. Триггер-защелка  module flop (input Clk, D, output reg Q); always @(Clk, D) if (Clk) Q <= D; endmodule lat D D Q Q Clk C Q 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 11 e-mail: hahanova@mail.ru
  • 12. Шаблон последовательностного устройства с асинхронными управляющими сигналами always @(posedge A, negedge B, negedge C, … posedge Clock) if (A) // A=1 <statement> //asychronous logic else if (!B) // B=0 <statement> //asynchronous logic else if (!C) // C=0 <statement> // asynchronous logic ... //Любое количество конструкций else if else // posedge Clock <statement> //synchronous logic 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 12 e-mail: hahanova@mail.ru
  • 13. Шаблон последовательностного устройства с синхронными управляющими сигналами always @(posedge Clock) if (A) // A=1 <statement> //sychronous logic else if (!B) // B=0 <statement> //synchronous logic else if (!C) // C=0 <statement> //synchronous logic ... //Любое количество конструкций else if else // posedge Clock <statement> //synchronous logic 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 13 e-mail: hahanova@mail.ru
  • 14. Пример. Счетчик (1) module AsynCounter #(parameter Num_bits = 2) (input Clk, Preset, UpDown, Clear, input [Num_bits-1:0] Data, output reg [Num_bits-1:0] Counter); always @(posedge Clear, posedge Clk) begin if (Clear) Counter <= 0; else if (Preset) Counter <= Data; else if (UpDown) Counter <= Counter + 1; else Counter <= Counter - 1; end endmodule 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 14 e-mail: hahanova@mail.ru
  • 15. Пример. Счетчик (2) Clk Preset UpDown [1:0] 11 0 [1:0] + [1:0] [1:0] 0 [1:0] [1:0] [1:0] [1:0] D[1:0] Q[1:0] [1:0] Counter[1:0] 01 [1:0] 1 un1_Counter[1:0] 1 R un3[1:0] Counter_7[1:0] Data[1:0] Counter[1:0] [1:0] Clear 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 15 e-mail: hahanova@mail.ru
  • 16. 3 Особые ситуации синтеза 1. Использование блокирующих и неблокирующих операторов 2. Оператор IF 3. Оператор CASE 4. Комбинационная схема из CASE 5. Использование casez и casex 6. Параллельный CASE 7. Оператор цикла 8. Локальное использование переменных 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 16 e-mail: hahanova@mail.ru
  • 17. 3.1 Блокирующие и неблокирующие операторы Не допускается использовать одновременно блокирующие и неблокирующие операторы для присвоения значений одному сигналу  always @(in1)  if (in2) begin begin out1[0] = 1’b0; out1[1] <= in1; if (in2) out1 = in1; end else out1 <= in2; else begin end out1[0] = in2; out1[1] <= 1’b1; end 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 17 e-mail: hahanova@mail.ru
  • 18. 3.2 Оператор IF module SelectOneOf (input [1:0] A, B, output reg [1:0] Z); always @(A, B) if (A>B) Z=A; else Z=B; endmodule [1:0] [1:0] B[1:0] [1:0] [1:0] < A[1:0] [1:0] 0 Z4 [1:0] [1:0] Z[1:0] [1:0] 1 Z[1:0] 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 18 e-mail: hahanova@mail.ru
  • 19. Появление триггера из оператора if module SelectOneOf (input A, B, output reg Z); always @(A, B) if (A) Z=B; endmodule lat B D Q Z A C Z 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 19 e-mail: hahanova@mail.ru
  • 20. 3.3 Оператор CASE module ALU #(parameter ADD = 'b00, SUB = 'b01, MUL = 'b10, DIV = 'b11) (input [1:2] Op, input [0:1] A, B, output reg [0:1] Z); always @(Op, A, B) case (Op) ADD : Z = A + B; SUB : Z = A - B; MUL : Z = A * B; DIV : Z = A / 2; endcase endmodule 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 20 e-mail: hahanova@mail.ru
  • 21. Результат синтеза оператора CASE [1:2] [2] Op[1:2] [0:1] [0:1] 0 [0:1] [0:1] [1:0] [1:0] + [0:1] B[0:1] 1 un1_B_1[1:0] un1_A[0:1] [0:1] A[0:1] [1] e [0:1] [2] d [1] 1 [2] e [0:1] [0:1] 0 [0:1] Z[0:1] d 0 1 un1_Op_4 e =0 d un1_Op[0] [0] Z[0:1] [0:1] [0:1] * [0:1] Z_4[0:1] [2] [1] un1_Op_3 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 21 e-mail: hahanova@mail.ru
  • 22. Триггер из CASE latrs 0 D 0 [0] C [0] [1:0] Q NextToggle[1:0] [1:0] [1] R Toggle[1:0] S NextToggle10 module NextStateLogic NextToggle_1[0] (input [1:0] Toggle, output reg [1:0] NextToggle); [1] [0] latrs always @(Toggle) NextToggle11 0 0 D C [1] Q case (Toggle) R S 2'b01: NextToggle = 2'b10; NextToggle_1[1] 2'b10: NextToggle = 2'b01; endcase endmodule 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 22 e-mail: hahanova@mail.ru
  • 23. 3.4 Комбинационная схема из CASE always @(Toggle) case (Toggle) 2'b01: NextToggle = 2'b10; 2'b10: NextToggle = 2'b01; default: NextToggle = 2'b01; NextToggle[1:0] endcase [0] [1:0] [1] Toggle[1:0] NextToggle14 un1_NextToggle14 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 23 e-mail: hahanova@mail.ru
  • 24. FULL CASE always @(Toggle) case (Toggle) //synthesis full_case 2'b01: NextToggle = 2'b10; 2'b10: NextToggle = 2'b01; endcase NextToggle[1:0] [1] [1:0] [1] Toggle[1:0] un1_Toggle[1] 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 24 e-mail: hahanova@mail.ru
  • 25. 3.5 Использование casez  module Casez_Ex (input [0:3] Pr_Counter, output reg [0:1] DoCommand); always @(Pr_Counter) casez(Pr_Counter) 4’b???1 : DoCommand = 0; 4’b??10 : DoCommand = 1; 4’b?100 : DoCommand = 2; 4’b1000 : DoCommand = 3; default : DoCommand = 3; endcase endmodule 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 25 e-mail: hahanova@mail.ru
  • 26. Результат синтеза casez DoCommand[0:1] [2] [0:3] [3] Pr_Counter[0:3] [3] DoCommand23[0] un1_DoCommand23_1 un1_DoCommand23_2 [0] [3] [3] e [2] 0 d [1] e DoCommand25 1 d e 0 d e 1 d [1] e 1 [3] [3] d [2] un1_DoCommand25_1 DoCommand_1[1] DoCommand24[0] 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 26 e-mail: hahanova@mail.ru
  • 27. Использование casex module PriorityLogic (input [2:0] Toggle, output reg [2:0] NextToggle); always @(Toggle) casex (Toggle) 3'bxx1: NextToggle = 3'b010; 3'bx1x: NextToggle = 3'b110; 3'b1xx: NextToggle = 3'b001; default: NextToggle = 3'b000; endcase endmodule 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 27 e-mail: hahanova@mail.ru
  • 28. Результат синтеза casex NextToggle[2:0] [1] [0] NextToggle19 [2] [0] [2:0] [1] Toggle[2:0] un1_Toggle_1 NextToggle20 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 28 e-mail: hahanova@mail.ru
  • 29. 3.6 Параллельный CASE module ParallelCase (input [2:0] Toggle; output reg [2:0] NextToggle); always @(Toggle) casex (Toggle) // synthesis parallel_case 3'bxx1: NextToggle = 3'b010; 3'bx1x: NextToggle = 3'b110; 3'b1xx: NextToggle = 3'b001; default: NextToggle = 3'b000; [1] endcase NextToggle[2:0] endmodule [2] [1] [2:0] [0] Toggle[2:0] un1_Toggle 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 29 e-mail: hahanova@mail.ru
  • 30. Использование неконстантных выражений выбора module Encoder (input [0:3] Bus; output reg [0:1] Address); always @(Bus) casez(1'b1) //synthesis full_case Bus[0] : Address = 2'b00; Bus[1] : Address = 2'b01; Bus[2] : Address = 2'b10; Bus[3] : Address = 2'b11; endcase endmodule 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 30 e-mail: hahanova@mail.ru
  • 31. Результат синтеза Address[0:1] [1] [0] Address19 [0] e 0 d e 1 d [2] [0] e [0:3] [1] 0 Bus[0:3] d un1_Bus_1 un1_Bus_2 Address20 e 1 d Address_1[1] [3] [2] un1_Bus_3 Address21 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 31 e-mail: hahanova@mail.ru
  • 32. 3.7 Оператор цикла (1) module Multiplexer Line[3:0] (input [1:0] Address, output reg [3:0] Line); Address[1:0] [1:0] [0] [1] _l0.Line19 integer J; always @(Address) [1] [0] for (J = 3; J >= 0; J=J-1) _l1.Line44 if (Address == J) Line[J] = 1; [0] [1] else _l2.Line69 Line[J] = 0; endmodule [0] [1] _l3.Line90 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 32 e-mail: hahanova@mail.ru
  • 33. [1] xin1[1:8] [1:8] [1:8] [1] xout[1:8] xin2[1:8] Оператор цикла (2) [1] [1:8] xout_1[1] [2] [2] [2] xout_1[2] module synXor8 [3] (output reg [1:8] xout, [3] xout_1[3] [3] input [1:8] xin1, xin2); [4] [4] [4] xout_1[4] reg [1:8] i; [5] [5] [5] xout_1[5] always @(*) [6] for (i = 1; i <= 8; i = i + 1) [6] [6] xout_1[6] xout[i] = xin1[i] ^ xin2[i]; [7] [7] [7] xout_1[7] endmodule 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ [8] [8] 33 [8] e-mail: hahanova@mail.ru xout_1[8]
  • 34. 3.8 Локальное использование переменных module GlobalReg (input Clk, input [3:0] State, output reg [3:0] NextState); reg [3:0] Temp; always @(negedge Clk) begin Temp = State; NextState <= Temp; end endmodule Clk [3:0] [3:0] [3:0] [3:0] State[3:0] D[3:0] Q[3:0] NextState[3:0] NextState[3:0] 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 34 e-mail: hahanova@mail.ru
  • 35. 3.8 Локальное использование переменных module GlobalReg (input Clk; input [3:0] State; output reg [3:0] NextState); reg [3:0] Temp; always @(negedge Clk) begin NextState <= Temp; Temp = State; end endmodule Clk [3:0] [3:0] [3:0] [3:0] [3:0] [3:0] State[3:0] D[3:0] Q[3:0] D[3:0] Q[3:0] NextState[3:0] Temp[3:0] NextState[3:0] 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 35 e-mail: hahanova@mail.ru
  • 36. Блокирующие и неблокирующие операторы module FlagBits (input ClockB, Strobe, Xflag, Mask, output reg RightShift, SelectFirst, CheckStop); always @(negedge ClockB) begin RightShift = RightShift ^ Strobe; SelectFirst <= RightShift | Xflag; CheckStop <= SelectFirst ^ Mask; end endmodule Strobe D Q CheckStop ClockB D Q D Q SelectFirst_2 SelectFirst CheckStop_2 CheckStop RightShift RightShift_2 SelectFirst RightShift Xflag Mask 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 36 e-mail: hahanova@mail.ru
  • 37. Неблокирующие операторы module FlagBits (input ClockB, Strobe, Xflag, Mask; output reg RightShift, SelectFirst, CheckStop); always @(negedge ClockB) begin RightShift <= RightShift ^ Strobe; SelectFirst <= RightShift | Xflag; CheckStop <= SelectFirst ^ Mask; end endmodule Xflag ClockB D Q CheckStop Strobe D Q D Q SelectFirst_2 SelectFirst CheckStop_2 CheckStop RightShift_2 RightShift SelectFirst Mask RightShift 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 37 e-mail: hahanova@mail.ru
  • 38. Неблокирующие операторы module NonBlockingExample (input Clk, Merge, ER, Xmit, FDDI, output reg Claim); reg FCR; always @(posedge Clk) begin FCR<=ER|Xmit; if(Merge) Claim <= FCR & FDDI; else Claim <= FDDI; end endmodule Merge Clk 0 D Q Claim ER 1 D Q Xmit Claim Claim_2 Claim_5 FCR_2 FCR FDDI 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 38 e-mail: hahanova@mail.ru
  • 39. Блокирующие операторы  module NonBlockingExample (input Clk, Merge, ER, Xmit, FDDI, output reg Claim); reg FCR; always @(posedge Clk) begin FCR = ER|Xmit; if(Merge) Claim = FCR & FDDI; else Claim = FDDI; end endmodule FDDI Merge Clk 0 D Q Claim ER 1 Xmit Claim Claim_2 Claim_5 FCR_2 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 39 e-mail: hahanova@mail.ru
  • 40. Диапазон векторов  module PartSelect (input[3:0] A, C, output [3:0] ZCat); assign ZCat [2:0] = {A[2], C[3:2]}; ZCat[3:0] endmodule A[3:0] [3:0] [3:0] [2] [3:2] C[3:0] 0 0 ZCat_1 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 40 e-mail: hahanova@mail.ru
  • 41. Константный индекс module ConstantIndex (input[3:0] A, C, RegFile, output [3:0] ZCat); assign ZCat [2:0] ={A[2], C[3:2]}; assign ZCat[0] = RegFile[3]; [3:0] [2] ZCat[3:0] endmodule A[3:0] [3:2] [3:0] C[3:0] 0 0 [2] RegFile[3:0] ZCat_1 [2:0] 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 41 e-mail: hahanova@mail.ru
  • 42. Переменная в качестве индекса  module NonComputeRight [0] [1:0] [1] Index[1:0] un1_Index_3 (input[3:0] Data, input [1:0] Index, e output Dout); [0] [1] [0] d e [1] d Dout un1_Index_4 e assign Dout = Data [Index]; [2] d e [3:0] [3] Data[3:0] d Dout [1] endmodule [0] un1_Index_5 [0] [1] un1_Index_2 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 42 e-mail: hahanova@mail.ru
  • 43. Синтез подпрограмм: Функции module comb15 (input [3:0] A, B, input CIN, output [3:0] S, output COUT); wire [1:0] S0, S1, S2, S3; function signed [1:0] ADD (input A, B, CIN); reg S, COUT; begin S = A ^ B ^ CIN; COUT = (A&B) | (A&CIN) | (B&CIN); ADD = {COUT, S}; end endfunction assign S0 = ADD (A[0], B[0], CIN), S1 = ADD (A[1], B[1], S0[1]), S2 = ADD (A[2], B[2], S1[1]), S3 = ADD (A[3], B[3], S2[1]), S = {S3[0], S2[0], S1[0], S0[0]}, COUT = S3[1]; endmodule 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 43 e-mail: hahanova@mail.ru
  • 44. Результат синтеза функции [0] S[3:0] [0] [0] [0] [3] [3] [0] [1] [3] COUT [2] [1] [1] [3] [3:0] [0] [2] A[3:0] B[3:0] [3:0] [0] [1] ADD_3.un16_COUT ADD[0] ADD_1.un6_COUT ADD_2.un11_COUT ADD_0.un1_COUT [3] [2] [1] [1] [1] [1] [0] [1] [1] [1] [1] CIN ADD_1.un7_COUT ADD_2.un12_COUT ADD_10[1] ADD_3.un17_COUT ADD[1] ADD_0.un2_COUT ADD_4[1] ADD_7[1] [3] [2] [2] [1] [1] [0] [1] [2] [0] [1] ADD_2.un13_COUT ADD_3.un18_COUT [1] ADD_0.un3_COUT ADD_1.un8_COUT ADD_10[0] [1] [1] [0] [1] ADD_7[0] [0] [0] [0] ADD_4[0] 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 44 e-mail: hahanova@mail.ru
  • 45. Синтез подпрограмм: Задачи module EXAMPLE (input [3:0] A, B, input CIN, output reg [3:0] S, output reg COUT); reg [1:0] S0, S1, S2, S3; task ADD (input A, B, CIN, output reg [1:0] C); reg S, COUT; begin S = A ^ B ^ CIN; [0] [0] [0] [3:0] S[3:0] COUT = (A&B) | (A&CIN) | (B&CIN); S_1[0] C = {COUT, S}; [1] end [1] [1] endtask S_1[1] always @(A, B, CIN) [2] [2] [2] begin S_1[2] ADD (A[0], B[0], CIN, S0); [3] ADD (A[1], B[1], S0[1], S1); [3] [3] [3] [2] [1] [3] [3:0] [0] [2] A[3:0] [1] B[3:0] [3:0] [0] ADD_3.un16_COUT S_1[3] ADD (A[2], B[2], S1[1], S2); ADD_0.un1_COUT ADD_1.un6_COUT ADD_2.un11_COUT ADD (A[3], B[3], S2[1], S3); [2] [3] S = {S3[0], S2[0], S1[0], S0[0]}; [1] COUT [0] CIN ADD_2.un12_COUT ADD_3.un17_COUT S3[1] ADD_1.un7_COUT S2[1] COUT = S3[1]; ADD_0.un2_COUT S0[1] S1[1] end [0] [1] [2] [3] endmodule ADD_0.un3_COUT ADD_1.un8_COUT ADD_2.un13_COUT ADD_3.un18_COUT 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 45 e-mail: hahanova@mail.ru
  • 46. Assign and Deassign Statements Не синтезируется Synplify module assig (input RST, SELECT, CLOCK, input [0:3] DATA_IN, output reg [0:3] STATE); always @ (RST) if(RST) assign STATE = 4'b0; else deassign STATE; always @ (posedge CLOCK) Результат синтеза модуля assig в XST STATE = DATA_IN; endmodule 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 46 e-mail: hahanova@mail.ru
  • 47. Контрольные вопросы 1  Сколько триггеров будет сгенерировано, если допустить, что каждая переменная соответствует одному биту? always @(posedge C) begin A1 = A&B; A2 <= A1^D; end 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 47 e-mail: hahanova@mail.ru
  • 48. Контрольные вопросы 2  Будет ли сгенерирован триггер из следующего кода? Если да, то сколько и какой/какие? always @(D, EС) begin: Design integer Tmp; if (EС) begin Q <= Tmp; Tmp = D; end end 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 48 e-mail: hahanova@mail.ru
  • 49. Контрольные вопросы 3  Какая логика будет сгенерирована для следующего кода? reg [3:0] OUT; wire [3:0] Shift, N; always @(posedge CLK) begin OUT <= Shift >> N; end 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 49 e-mail: hahanova@mail.ru
  • 50. Контрольные вопросы 4  Будут ли сгенерированы триггер или триггеры для следующего кода? always @(Sel) case (Sel) // synthesis full_case 2’b01: Q <= 2’b10; 2’b10: Q <= 2’b01; endcase 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 50 e-mail: hahanova@mail.ru
  • 51. Контрольные вопросы 5  Какая логика генерируется из следующего кода? wire A1, A2; reg Q; always begin wait (A1); #10 Q <= A2; end 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 51 e-mail: hahanova@mail.ru
  • 52. Контрольные вопросы 6  Следующий код является моделью двух регистров. Результаты моделирования после синтеза не совпали с функциональным моделирования. Почему? always @(posedge CLK) begin if (EN) R1 = D1; else R1 = R2; end always @(posedge CLK) begin if (EN) R2 = D2; else R2 = R1; end 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 52 e-mail: hahanova@mail.ru
  • 53. Контрольные вопросы 7  Результаты моделирования после синтеза не совпали с результатами функционального моделирования. Почему? always @(A) C <= A | B; 13.03.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ 53 e-mail: hahanova@mail.ru