Transcript Week 9

ECE 551
Digital System Design &
Synthesis
Lecture 09
Synthesis of Common Verilog
Constructs
Overview





Don’t Cares and z’s in synthesis
Unintentional latch synthesis
Synthesis & Flip-Flops
Gating the clock… and alternatives
Loops in synthesis
2
Synthesis Of x And z

Only allowable uses of x is as “don’t care”, since x
cannot actually exist in hardware
 in casex
 in casez
 in defaults of conditionals such as if, case, ?

Only allowable uses of z:
 As a “don’t care”
 Constructs implying a 3-state output
3
Don’t Cares


x assigned as a default in a conditional, case, or
casex.
x, ?, or z within case item expression in casex
 Does not actually output “don’t cares”!
 Values for which input comparison to be ignored
 Lets synthesizer choose between 0 or 1
 Choose whichever helps meet design goals

z, ? within case item expression in casez
 Same conditions as listed above except does not
apply to x
4
Don’t Cares Example [1]

Give synthesizer flexibility in optimization
case (state)
3’b000: out = 1’b0;
3’b001: out = 1’b1;
3’b010: out = 1’b1;
3’b011: out = 1’b0;
3’b100: out = 1’b1;
// below states not used
3’b101: out = 1’b0;
3’b110: out = 1’b0;
3’b111: out = 1’b0;
endcase
VS
case (state)
3’b000: out = 1’b0;
3’b001: out = 1’b1;
3’b010: out = 1’b1;
3’b011: out = 1’b0;
3’b100: out = 1’b1;
default: out = 1’bx;
endcase
5
Don’t Cares Example [2]

Synthesis results for JUST output calculation:
VS
Area = 21.04
Area = 15.24
6
Don’t Cares Example [3]

casex can reduce number of conditions
specified and may aid synthesis
casex (state)
3’b000: out = 1’b1;
3’b001: out = 1’b1;
3’b010: out = 1’b1;
3’b011: out = 1’b1;
3’b100: out = 1’b0;
3’b101: out = 1’b0;
3’b110: out = 1’b1;
3’b111: out = 1’b1;
endcase
VS
casex (state)
3’b0??: out = 1’b1;
3’b10?: out = 1’b0;
3’b11?: out = 1’b1;
endcase
7
Synthesis Of z

Example 1: (Simple Tri-State Bus)
assign bus_line = (en) ? data_out : 32’bz;

Example 2 (Bidirectional Bus)
// bus_line receives from data when en is 0
assign bus_line = (!en) data : 32’bz;
// bus_line sends to data when enable is 1
assign data = (en) ? bus_line : 32’bz;
8
Combinational Logic Hazards


Avoid structural feedback in continuous
assignments, combinational always
assign z = a | y;
assign y = b | z;
// feedback on y and z signals!
Avoid incomplete sensitivity lists in combinational
always
always (*)
// helps to avoid latches

For conditional assignments, either:

For warning, set hdlin_check_no_latch true
before compiling
 Set default values before statement
 Make sure LHS has value in every branch/condition
9
Synthesis Example [1]
module latch2(input a, b, c, d, output reg out);
always @(a, b, c, d) begin
if (a) out = c | d;
else if (b) out = c & d;
end
endmodule
Area = 44.02
10
Synthesis Example [2]
module no_latch2(input a, b, c, d, output reg out);
always @(a, b, c, d) begin
if (a) out = c | d;
else if (b) out = c & d;
else out = 1’b0;
end
endmodule
Area = 16.08
11
Synthesis Example [3]
module no_latch2_dontcare(input a, b, c, d, output reg out);
always @(a, b, c, d) begin
if (a) out = c | d;
else if (b) out = c & d;
else out = 1’bx;
end
endmodule
When can this be done?
Area = 12.99
12
Registered Combinational Logic

Combinational logic followed by a register
always @(posedge clk)
y <= (a & b) | (c & d);
always @(negedge clk)
case (select)
3’d0: y <= a; 3’d1: y <= b;
3’d2: y <= c; 3’d3: y <= d;
default y <= 8’bx;
endcase


The above behaviors synthesize to combinational
logic followed by D flip-flops.
Combinational inputs (e.g., a, b, c, and d) should
not be included in the sensitivity list
13
Flip-Flop Synthesis

Each variable assigned in an edge-controlled
always block implies a flip-flop.
14
Gated Clocks

Use only if necessary (e.g., for low-power)
 Clock gating is for experts!
module gated_dff(clk, en, data, q);
input clk, en, data;
output reg q;
wire
my_clk = clock & en;
always @(posedge my_clk)
q <= data;
endmodule


When clock_en is zero flip-flop won’t update.
What problems might this cause?
15
Alternative to Gated Clocks
module enable_dff(clk, en, data, q);
input clk, en, data;
output reg q;
always @(posedge clock)
if (en) q <= data;
endmodule


Flip-flop output can only change when en is
asserted
How might this be implemented?
16
Clock Generators


Useful when you need to gate large chunks of your
circuit.
Adding individual enable signals adds up
module clock_gen(pre_clk, clk_en, post_clk);
input pre_clk, clk_en;
output post_clk;
assign post_clk = clk_en & pre_clk;
endmodule


Key: If you do this, you cannot use pre_clk on any
flip-flops! Exclusively use post_clk.
This is still mostly recommended only for experts.
17
Loops


A loop is static (data-independent) if the number of
iterations is fixed at compile-time
Loop Types
 Static without internal timing control



 Combinational logic
Static with internal timing control
 Sequential logic
Non-static without internal timing control
 Not synthesizable
Non-static with internal timing control
 Sometimes synthesizable, Sequential logic
18
Static Loops w/o Internal Timing


Combinational logic results from “loop unrolling”
Example
always@(a) begin
andval[0] = 1;
for (i = 0; i < 4; i = i + 1)
andval[i + 1] = andval[i] & a[i];
end


What would this look like?
How can we register the outputs?
19
Static Loops with Internal Timing

If a static loop contains an internal edge-sensitive
event control expression, then activity distributed
over multiple cycles of the clock
always begin
for (i = 0; i < 4; i = i + 1)
@(posedge clk) sum <= sum + i;
end

What does this loop do?

This might synthesize, but why take your chances?
20
Non-Static Loops w/o Internal Timing

Number of iterations is variable
 Not known at compile time


Can be simulated, but not synthesized!
Essentially an iterative combinational circuit of data
dependent size!
always@(a, n) begin
andval[0] = 1;
for (i = 0; i < n; i = i +1)
andval[i + 1] = andval[i] & a[i];
end

What if n is a parameter?
21
Non-Static Loops with Internal Timing



Number of iterations determined by
 Variable modified within the loop
 Variable that can’t be determined at compile time
Due to internal timing control—
 Distributed over multiple cycles
 Number of cycles determined by variable above
Variable must still be bounded
always begin
continue = 1’b1;
for (; continue; ) begin
@(posedge clk) sum = sum + in;
if (sum > 8’d42) continue = 1’b0;
end
end
Timing controls
inside the always
block make design
guidelines fuzzy…
Confusing, and best
to avoid.
22
Unnecessary Calculations


Expressions that are fixed in a for loop are
replicated due to “loop unrolling.”
Solution: Move fixed (unchanging) expressions
outside of all loops.
for (x = 0; x < 5; x = x + 1) begin
for (y = 0; y < 9; y = y + 1) begin
index = x*9 + y;
value = (a + b)*c;
mem[index] = value;
end
end

Which expressions should be moved?
23
Unnecessary Calculations


Expressions that are fixed in a for loop are
replicated due to “loop unrolling.”
Solution: Move fixed (unchanging) expressions
outside of all loops.
value = (a + b)*c;
for (x = 0; x < 5; x = x + 1) begin
index = x*9;
for (y = 0; y < 9; y = y + 1) begin
mem[index+y] = value;
end
end
Not so different from Loop optimization in software.
24
FSM Replacement for Non-Static Loops


Not all loop structures supported by vendors
Can always implement a loop with internal timing
using an FSM
 Can make a “while” loop easily by rewriting as FSM
 Often use counters along with the FSM


All (good) synthesizers support FSMs!
Synopsys supports for-loops with a static number
of iterations

Don’t bother with “fancy” loops outside of
testbenches
25
Review Questions

Draw the Karnaugh-map for each statement,
assuming each variable is one bit.
if (c) z = a | b; else z = 0;
if (c) z = a | b; else z = 1`x;
Give a simplified Boolean expression for each statement

What would you expect to get from the following
expressions?
if (c) z = a & b;
26
Review Questions

Rewrite the following code, so that it takes two clock cycles
and can use only a single multiplier and adder to compute z.
Draw potential hardware for each piece of code.
reg [15:0] z;
reg [7:0] a, b, c, d
always @(posedge clock) z = a*b + c*d;
27
Review Questions

What hardware would you expect from the following code?
module what(input clk, input [7:0] b, output [7:0] c);
reg [7:0] a[0:3];
integer i;
always@(posedge clk) begin
a[0] <= b;
for (i = 1; i < 4; i=i+1) a[i] <= a[i-1] + b;
end
assign c = a[3];
endmodule
28