Sequential Logic Synthesis (part I)


Index

o Design unit overview
o The RTL style
o Concurrent vs. Sequential statements
o Variables vs. Signals
o Register inference
o Edge expressions



Design Unit overview

o Packages
o Declarations
o Components
o Constants
o (Sub)types
o Subprograms (functions and procedures)
o Entities
o Architectures
o Declarations
o Local signals
o Concurrent statements
o (Conditional) signal assignments - delays ignored
x <= a + b when c1 else a + c;
o Subprogram calls
o Components instantiations
o Generate statements
o (Nested) blocks
o Processes
o Configurations (default: entity to MRA architecture)



Process

The elementary unit of behavior - described by a discrete algorithm

o Declarations
o Local variables
o Sequential statements
o Signal assignments
o Subprogram calls
o Variable assignments
x := a + c;
o Control flow stmts
o Conditional stmts
o Priority (if ..)
o Case
o Loops
o Computable (for ..)
o Non-computable (while .. loop)
o next, exit
o null
o wait
All sequential statements except from wait can be used in subprograms as well.




Concurrent vs. Sequential statements

o Concurrent stmts:
o Model asynchronous dataflow
o Order is irrelevant, i.e. parallel assignments
o Only signals allowed
o If more than one drivers for a signal, it must be of a resolved type
o Are translated to processes:
o x<= a;
o process (a)
begin
x<a;
end process;
o process
begin
x<= a;
wait on a;
end process;
o Sequential stmts:
o Order matters!
o Model discrete algorithms
o Signals AND variables are allowed



Variables vs. Signals

o Variables:
o only used inside processes and subprograms
o assignment is immediate
o used to store temporary results or current signal values
o Signals:
o correspond to (memory-less) nets
o the only form of communication between processes and other concurrent stmts
o inside a process only the last signal assignment is effective



Inferring Synchronous Logic

o Why avoid explicit register instantiation
o (+ve) <edge> (clk is one bit encodable):
o clk'event and clk='1'
o not clk'stable and clk='1'
o Two forms (<edge> cannot be used as on operand):
o wait until <edge>;
o if <edge> ....
o Do not assign to/from clock signals!
o If more than one clocks, use different processes for each
o Signals stored in FFs:
o Signals driven by the process
o Variables that are read before they are set
o Implicit/explicit state vectors
o Example: modulo-10 counter




Too many registers!

o Signals driven by a process containing <edge> expressions are registered

o To avoid extra registers separate combinational from sequential processes
example

o In general, each process and concurrent signal assignment produce a piece of HW
o Use a single process for each type of logic



Alternative forms of FF inference

o Basic DFF:
process(clk,data)
begin
if (clk'event and clk='1') then
q<=data;
end if;
end process;
o DFF with asynchronous reset:
prosess(clk,reset_low,sync_data)
begin
if reset_low='0' then
q<='0';
elsif (clk'event and clk='1') then
q<=sync_data;
end if;
end process;
o DFF with synchronous reset:
process(reset_low,clk,sync_data)
begin
if (clk'event and clk='1') then
if reset_low='0' then
q<='0';
else q<=sync_data;
end if;
end if;
end process;
o In general, if <edge> more flexible than wait <edge> but more dangerous:
o Do NOT use more than one if <edge> expressions in a process - but you can use many wait <edge>
o Do NOT assign a value to a variable/signal on a FALSE branch of an if <edge> expression
o Watch out! if stmts can infer:
o Muxes
o Latches
o FFs
o Combinational logic in for loops and subprograms



BACK TO THE TABLE OF CONTENTS





Last Modified: December 21/1995