Professional Documents
Culture Documents
Verilog Synthesis Logic Synthesis
Verilog Synthesis Logic Synthesis
• Synthesis vs. Compilation • Verilog and VHDL started out as simulation languages, but soon
programs were written to automatically convert Verilog code into
• Descriptions mapped to hardware low-level circuit descriptions (netlists).
• Verilog design patterns for best synthesis
Verilog Synthesis circuit
HDL Tool netlist
Fall 2005 Lec #10 -- HW Synthesis 1 Fall 2005 Lec #10 -- HW Synthesis 2
Fall 2005 Lec #10 -- HW Synthesis 3 Fall 2005 Lec #10 -- HW Synthesis 4
1
Simple Example Module Template
module foo (a,b,s0,s1,f); Synthesis tools expects to find modules in this format .
input [3:0] a; module <top_module_name>(<port list>);
input [3:0] b; /* Port declarations. followed by wire, reg, integer, task and function declarations */
/* Describe hardware with one or more continuous assignments, always blocks, module
input s0,s1; instantiations and gate instantiations */
output [3:0] f; // Continuous assignment
reg f; wire <result_signal_name>;
• Order of these statements is
assign <result_signal_name> = <expression>;
always @ (a or b or s0 or s1) // always block irrelevant, all execute concurrently
if (!s0 && s1 || s0) f=a; else f=b; always @(<event expression>)
endmodule begin • Statements between the begin and
// Procedural assignments
// if statements
end in an always block execute
• Should expand if-else into 4-bit wide multiplexer (a, b, f are 4-bit vectors) and // case, casex, and casez statements sequentially from top to bottom
optimize/minimize the control logic: // while, repeat and for loops
(however, beware of blocking versus
// user task and user function calls
end non-blocking assignment)
// Module instantiation
<module_name> <instance_name> (<port list>); • Statements within a fork-join
statement in an always block
// Instantiation of built-in gate primitive
gate_type_keyword (<port list>);
endmodule execute concurrently
Fall 2005 Lec #10 -- HW Synthesis 7 Fall 2005 Lec #10 -- HW Synthesis 8
Fall 2005 Lec #10 -- HW Synthesis 9 Fall 2005 Lec #10 -- HW Synthesis 10
Fall 2005 Lec #10 -- HW Synthesis 11 Fall 2005 Lec #10 -- HW Synthesis 12
2
Combinational Logic Always Blocks Combinational Logic Always Blocks (cont.)
• Make sure all signals assigned in a combinational always block are • To avoid synthesizing a latch in this case, add the missing select
explicitly assigned values every time that the always block line:
2'd2: out = c;
executes--otherwise latches will be generated to hold the last
• Or, in general, use the “default” case:
value for the signals not assigned values!
default: out = foo;
module mux4to1 (out, a, b, c, d, sel);
output out;
• If you don’t care about the assignment in a case (for instance
input a, b, c, d; you know that it will never come up) then assign the value “x” to
• Example: input [1:0] sel; the variable; E.g.:
– Sel case value 2’d2 omitted reg out; default: out = 1‘bx;
always @(sel or a or b or c or d)
– Out is not updated when begin The x is treated as a “don’t care” for synthesis and will simplify
select line has 2’d2 case (sel) the logic
– Latch is added by tool to 2'd0: out = a;
2'd1: out = b; (The synthesis directive “full_case” will accomplish the same,
hold the last value of out
under this condition
2'd3: out = d; but can lead to differences between simulation and synthesis.)
endcase
end
endmodule
Fall 2005 Lec #10 -- HW Synthesis 13 Fall 2005 Lec #10 -- HW Synthesis 14
B- 2
10
C+ 2
C 2
5
GPA=3.43
0
38 39 40 41 42 43 44 45 46 47 48 49 50
Score
Mean
Fall 2005 Lec #10 -- HW Synthesis 15 Fall 2005 Lec #10 -- HW Synthesis 16
3
Encoder Example (cont.) Encoder Example (cont.)
• Circuit would be simplified during synthesis to take advantage of • If you can guarantee that only one 1 appears in the input (one hot
constant values as follows and other Boolean equalities: encoding), then simpler logic can be generated:
always @(x)
begin : encode
if (x[0]) y = 2'b00;
else if (x[1]) y = 2'b01;
else if (x[2]) y = 2'b10;
else if (x[3]) y = 2'b11;
else y = 2'bxx;
end
• If the input applied has more than one 1, then this version
functions as a “priority encoder” -- least significant 1 gets priority
(the more significant 1’s are ignored); the circuit will be simplified
A similar simplification would be applied to the if-else version also when possible
Fall 2005 Lec #10 -- HW Synthesis 19 Fall 2005 Lec #10 -- HW Synthesis 20
• Note now more than one case might match the input
• Therefore use “parallel case” directive: without it, synthesis adds • Note: “parallel case” directive is not used, synthesis adds appropriate
appropriate matching logic to force priority matching logic to force priority
– Semantics of case construct says that the cases are evaluated from – Just what we want for a priority encoder
top to bottom • Behavior matches that of the if-else version presented earlier
– Only an issue for synthesis when more than one case could match input
Fall 2005 Lec #10 -- HW Synthesis 21 Fall 2005 Lec #10 -- HW Synthesis 22
Fall 2005 Lec #10 -- HW Synthesis 23 Fall 2005 Lec #10 -- HW Synthesis 24
4
FSMs (cont.) More Help
/* always block for CL */ • Use CASE statement in an • Online documentation for Synplify
always @(state or enable or data_in)
begin always to implement next Synthesis Tool:
case (state) state and output logic – Under Documents/General Documentation, see
/* For each state def output and next */
idle : begin • Always use default case and Synplify Web Site/Literature:
data_out = 1’b0; http://www.synplicity.com/literature/index.html
assert the state variable
if (enable)
next_state = read; and output to ‘bx: – Online examples from Synplicity
else next_state = idle;
• Avoids implied latches
end • Bhasker is a good synthesis reference
read : begin … end • Allows use of don’t cares
write : begin … end leading to simplified logic • Trial and error with the synthesis tool
default : begin
• “FSM compiler” within synthesis – Synplify will display the output of synthesis in
next_state = default; tool can re-encode your states; schematic form for your inspection--try
data_out = 1’bx; Process is controlled by using a different input and see what it produces
end synthesis attribute (passed in a
endcase
end comment).
endmodule • Details in Synplify guide
Fall 2005 Lec #10 -- HW Synthesis 25 Fall 2005 Lec #10 -- HW Synthesis 26
Bottom-line
• Have the hardware design clear in your mind when you
write the verilog
• Write the verilog to describe that HW
– It is a Hardware Description Language not a Hardware
Imagination Language
• If you are very clear, the synthesis tools are likely to
figure it out