부호, 곱연산

SungchulCHA·2024년 6월 27일

Verilog

목록 보기
5/8

Input_A * 2**N = Input_A << N

밑이 2가 아니면 제곱승은 지원 안됨

assign Data_Out = 2 ** In_A;

Unsupported

assign Data_Out = 2'b10 ** In_A;

실수가 아닌 정수로

  • localparam 도 unsupported

`define 사용

  • casex, casez 합성 안됨
casex (2'b1x)
  Sel_A:   D_Out = In_A + 1;
  Sel_B:   D_Out = In_B + 1;
  default: D_Out = In_C;
endcase
if (Sel_A[1] == 1'b1)
  begin
    D_out = In_A + 1;
  end
else if (Sel_B[1] == 1'b1)
  begin
    D_Out = In_B + 1;
  end
else
  D_Out = In_C;

casex 문을 위와 같이 코딩 가능


  • for Loop Parameter Restriction
for (K = Input_Variable; K < 128; K = K + 1)
  begin
    loop_body
  end

for 안의 K가 변수면 합성 안됨

begin: LOOP_LABEL

  for (K = 0; K < 128; K = K + 1)
    begin
      J = K + Input_Variable;
      if (J < 128)
        begin
          loop_body;
        end
      else
        begin
          disable LOOP_LABEL;
        end
  end
  
end

always @(posedge Clock)
begin: FF_Block
  Data_Out = Data_In;
end

// Asynchronous reset
always @ (negedge Reset)
begin
  disable FF_Block; // Synthesis error
  Data_Out = 1'b0;
end

disable statement는 일시적으로 사라질 수 있는 sequential block 안에 있어야함.


always @ (posedge Clock, negedge Reset_N)
begin

  if (!Reset_N)
    begin
      D_Out_1 <= 1'b0;
    end
  else if (Enable_1)
    begin
      D_Out_1 <= 1'b0;
    end
  else if (&Enable_2_Vector)
    begin
      D_Out_1 <= 1'b1;
    end
  else
    begin
      D_Out_1 <= D_Out_1;
    end
    
  if (!Reset_N)
    begin
      D_Out_2 <= 1'b0;
    end
  else if (Enable_1)
    begin
      D_Out_2 <= 1'b0;
    end
  else if (&Enable_2_Vector)
    begin
      D_Out_2 <= 1'b1;
    end
  else
    begin
      D_Out_2 <= D_Out_2;
    end
  ...
end

안됨. asynchronous event listener 묶고,
나머지 signal들은 else 문에 begin end로 묶어서 사용


nonedge signal 사용법

always @ (posedge Clock, negedge Load)
begin
  if (!Load) // Asynchronous statements
    begin
      Data_Out <= Data_In;
    end
  else
    begin
           // Synchronous statements
    end
end

Multiplication

module Signed_Multipliers (input         [7:0] Data_A, // unsigned
                           input         [7:0] Data_B, // unsigned
                           output signed [15:0] Data_Out);

  // signed multiplication
  assign Data_Out = $signed(Data_A) * $signed(Data_B);
  
endmodule

signed signal은 signed signal로 연산하는 원칙에 맞추면 합성이 효율적으로, 빨리 된다.

module Variable_Multipliers (Data_A, Data_B, Data_Out);
  input [7:0] Data_A;
  input [7:0] Data_B;
  
  output reg [15:0] Data_Out;
  
  always @ (Data_A, Data_B)
  begin : Block_Label
    /* synopsys resource R0 :
       ops = "A1",
       map_to_module = "DW02_mult",
       implementation = "wall";
    /*
    Data_Out = Data_A * Data_B; // synopsys label A1
  end
  
endmodule

DW02_mult 를 사용해라
ops 에 여러 라벨을 적고 각 연산자마다 라벨을 다르게 부여 가능

profile
Myongji UNIV. B.S. in Electronic Engineering

0개의 댓글