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 (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
disablestatement는 일시적으로 사라질 수 있는 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로 묶어서 사용
always @ (posedge Clock, negedge Load)
begin
if (!Load) // Asynchronous statements
begin
Data_Out <= Data_In;
end
else
begin
// Synchronous statements
end
end
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에 여러 라벨을 적고 각 연산자마다 라벨을 다르게 부여 가능