ShareCG: ASICs .. the Book

# 12.14  Problems

* = Difficult, ** = Very difficult, *** = Extremely difficult

12.1 (Comparator/MUX)

• a. (30 min.) Build a DesignWorks (or use another tool) model for the schematic in Figure 12.1 and simulate the operation of this circuit to check that it performs the same function as the Verilog code. Hint: You could also use VeriWell to simulate the Verilog netlist.
• b. (30 min.) Simulate the schematic (or the Verilog netlist) shown in Figure 12.2 and check that it performs the comparator/MUX function correctly.
• c. (30 min.) Simulate the schematic (or the Verilog netlist) of Figure 12.3 . If you have access to a logic synthesizer and cell library, you might resynthesize the comparator/MUX and compare the results with those shown in Figures 12.2 and 12.3 .
• d. (20 min.) Build a schematic (or Verilog model) for macro cm8 in Figure 12.4 .
• e. (30 min.) Simulate the schematic (or Verilog netlist) shown in Figure 12.4 .

12.2 (*Verilog assignments, 15 min.) Simulate and test the following model paying attention to initialization. Attempt to synthesize it. Explain your results.

module dff (D, Q, Clk, Rst);

parameter width = 1, reset_value = 0; input [width - 1 : 0] D;

output [width - 1 : 0] Q; reg [width - 1 : 0] Q; input Clk,Rst;

initial Q = {width{1'bx}};

always @ ( posedge Clk or negedge Rst )

if ( Rst == 0 ) Q <= #1 reset_value; else Q <= #1 D;

endmodule

12.3 (Digital filter) (30 min.) Write HDL code to model the following filter:

y0 <= c(0) * x(0) + c(1) * x(1) + b(2) * x(2) ;

Use c(0) = -4 , c(0) = +5 , c(0) = -3 , but make your code flexible so that these coefficients may be changed. (120 min.) Simulate, test, and synthesize your model. Hint: You should use the transfer equation in your code (Verilog or VHDL).

12.4  (Hand design, 60 min.) Use hand calculation and gate delay values obtained from a data book to estimate the critical path of the comparator/MUX shown in Figure 12.1 . Assume the critical path (the one with the longest delay) is from the a input (the input with the largest load) -> XOR -> inverter -> four-input NAND -> three-input OR -> select input of two-input MUX (the symbol -> means “through the”). You will need to find the t PHL (falling) and t PLH (rising) propagation delays for each gate used in the critical path. Do not adjust the delays for the loading (fanout) at the output of each gate on the critical path, assume a loading equal to one input of a two-input NAND gate. Change the AND–NOR gate combination to a NAND–NAND gate combination and recalculate the critical path delay.

12.5 (Critical path, 30 min.) Enter the schematic shown in Figure 12.1 and, using a gate-level simulator or a timing analyzer, obtain the delays from the a and b inputs to the outputs. What is the critical path?

12.6  (Verilog sensitivity list, 30 min.) Simulate the following Verilog module with the test pattern shown and explain your results.

module and2_bad(a, b, c); input a, b; output c; reg c;

// test pattern: (a b) = (1 1) (0 1) (0 0) (1 0) (1 1)

always @(a) c <= a & b;

endmodule

Can you synthesize this module as it is? What is the error message if you get one? If you can synthesize this module as it is, simulate the synthesized logic and compare the output with the Verilog simulation.

12.7  (Verilog decoder, 30 min.) Synthesize the following Verilog module with minimum-area constraint and then with maximum-speed constraint. Compare the resulting logic in each case.

module Decoder4_to_16(Enable, In_4, Out_16);

input Enable; input [3:0] In_4; output [15:0] Out_16;

reg [15:0] Out_16;

always @(Enable or In_4)

begin

Out_16 = 16'hzzzz;

if (Enable == 1) begin Out_16 = 16'h0000; Out_16[In_4] = 1; end

end

endmodule

What happens if you change the if statement to if (Enable === 1) ?

12.8  (Verilog eight-input MUX, 20 min.) Synthesize the following code with maximum-speed constraint and then minimum-area constraint. Compare the results.

module Mux8_to_1(InBus, Select, OutEnable, OutBit);

input [7:0] InBus; input [2:0] Select; input OutEnable;

output OutBit; reg OutBit;

always @(OutEnable or Select or InBus)

begin

if (OutEnable == 1) OutBit = InBus[Select]; else OutBit = 1'bz;

end

endmodule

12.9  (Verilog parity generator, 30 min.) Synthesize the following code with maximum-speed constraint and then minimum-area constraint. Compare the results.

module Parity (BusIn, ParityB);

input [8:0] BusIn; output ParityB; reg ParityB;

always @(BusIn) if (^Busin == 0 ) ParityB = 1; else ParityB = 0;

endmodule

12.10 (Verilog edges and levels, 30 min.) What is the function of the following model? List the cells produced by a logic synthesizer, their function, and an explanation of why they were synthesized.

module DD(D, C, R, Q, QB); input D, C, R; output Q, QB; reg Q, QB, L;

always @( posedge C or posedge R) if (R == 1) L = 0; else L = D;

always @(L) begin Q = L; QB = ~L; end

endmodule

12.11  (Verilog adders, 120 min.) Synthesize the following code with maximum-speed constraint and then minimum-area constraint. What type of adder architecture does the synthesis tool produce in each case (ripple-carry, lookahead, etc.)? Show exactly how you reached your conclusion. If you can, use either synthesis tool directives, shell commands, or standard components (Synopsys DesignWare or Xilinx X-BLOX, for example) to direct the synthesis tool to a specific adder implementation. Check that when you optimize the synthesized logic the adder architecture is not broken up. Next, if you can, find a way to make the synthesis tool break up the adder and reoptimize the logic. Does anything change?

input [3:0] a; input [3:0] b; output [3:0] outp; reg [3:0] outp;

// if you can, change the next line to drive your synthesis tool

// pragma|compass|synopsys|whatever max_delay constraint

begin

outp <= a + b; // Map me to DesignWare, X-Blox etc., if you can.

end

endmodule

12.12  (Elementary gates in Verilog, 60 min.) Synthesize and optimize the following (you will have to write some more code to go around these statements):

And3 = &{In1,In2,In3}; Or3 = |{In1,In2,In3}; Xor3 = ^{In1,In2,In3};

This should produce three-input AND, OR, and XOR gates. Now synthesize and optimize eight-input AND, OR, and XOR gates in the same way with minimum-area constraint and then maximum-speed constraint. Compare your results. How and why do the synthesis results and your answers change if you place a large capacitive load on the outputs. Hint: Try a load equivalent to 16 minimum-size inverters. Can you explain these results using logical effort?

12.13 (Synthesizable VHDL, 20 min.) Complete the following code fragment and try to synthesize the VHDL:

process begin

wait until Clk = '1';

Phase <= "0" after 0 ns; Phase <= "1" after 10 ns;

end process ;

What is the error message? Synthesize this code, and explain the results:

process begin

wait until Clk_x_2 = '1';

case (Phase) is

when '0' => Phase <= '1'; when others => Phase <= '0';

end case ;

end process ;

12.14 (VHDL and process sensitivity list, 15 min.) Simulate the following code with the test input vectors shown:

entity AND2 is port (a, b in : BIT; c out : BIT); end AND2;

architecture Bad_behavior of AND2 is begin

test inputs: (a b) = (1 1) (0 1) (0 0) (1 0) (1 1)

process (a) begin c <= a and b; end process ;

end ;

Now try to synthesize this code. Do you get an error message? If not, try simulating the synthesized logic and compare with your earlier simulation results.

12.15 (MUX logic, 20 min.) Synthesize the following VHDL:

entity MuxLogic is

port (InBus : in BIT_VECTOR(3 downto 0);

Sel : in BIT_VECTOR(1 downto 0);

OutBit : out BIT);

end MuxLogic;

architecture Synthesis_1 of MuxLogic is

begin process (Sel, InBus)

begin

case Sel is

when "00" => OutBit <= not (InBus(0));

when "01" => OutBit <= InBus(1) and InBus(2);

when "10" => OutBit <= InBus(2) or InBus(1);

when "11" => OutBit <= InBus(3) xor InBus(0);

end case ;

end process ;

end Synthesis_1;

Does the synthesizer implement the case statement using a MUX? Explain your answer carefully by using the synthesis reports and the synthesized netlist. Try synthesizing again with minimum-area constraint and then maximum-speed constraint. Does this alter the implementation chosen by the synthesis tool? Explain.

12.16 (Arithmetic overflow in VHDL) Synthesize the following model (you will need arithmetic packages):

InBusB : in Std_logic_vector(3 downto 0);

OutBus : out Std_logic_vector(3 downto 0));

architecture Behavior of Adder1 is begin OutBus <= InBusA + InBusB;

end Behavior;

Repeat the synthesis with the following modification and explain the difference:

OutBus : out Std_logic_vector(4 downto 0));

OutBus <= ( "0" & InBusA) + ("0" & InBusB) ;

module TestIntegers (clk, out)

integer i; reg [1:0] out; input clk; output out;

always @( posedge clk) begin i = i + 1; out = i; end

endmodule

Write a test module for TestIntegers and simulate the behavior. Try to synthesize TestIntegers and explain what happens.

12.18  (Verilog shift register, 30 min.) Consider this code for a shift register:

module Shift1 (clk, q0, q1, q2)

input clk, q0; output q2, q1; reg q2, q1;

always (@ posedge clk) q1 = q0; always (@ posedge clk) q2 = q1;

endmodule

Write a module Test to exercise this module. Does it simulate correctly? Can you synthesize your code for Shift1 as it is? Change the body of the code as follows (call this module Shift2 ):

always (@ posedge clk) q1 = #1 q0; always (@ posedge clk) q2 = #1 q1;

Does this simulate correctly? Now change the code as follows ( Shift3 ):

always (@ posedge clk) begin q1 = q0; q2 = q1; end

Does this simulate correctly? Can you synthesize Shift3 ? Finally, change the code to the following ( Shift4 ):

always (@ posedge clk) q1 <= q0; always (@ posedge clk) q2 <= q1

Does this simulate correctly? Can you synthesize Shift4 ?

12.19 (Reset, 20 min.) Use simulation results to explain the difference between:

always (@ posedge clk) if (clr) Q = 0;

always (@ posedge clk) if (rst) Q = 1;

and

always (@ posedge clk) begin if (clr) Q = 0; if (rst) Q = 1; end

12.20 (Verilog assignments, 30 min.) Consider the following Verilog module:

module TestAssign1(sel) input sel; reg outp;

always @sel begin outp <= 1; if (sel) outp <= 0; end

endmodule

Write a module to drive TestAssign1 and simulate your code. Now consider the following modification (call this TestAssign2 ):

if (sel) outp <= 0; else outp <= 1;

Simulate TestAssign2 and compare your results. Try to synthesize TestAssign1 and TestAssign2 . Comment on any problems you have and how you resolved them. Compare the behavior of the synthesized logic with the simulations.

12.21 (VHDL sequential logic, 60 min.) Consider the following processes:

S1: process (clk) begin

if clk'EVENT and clk = '1' then count <= count + inc; end if ;

end process ;

S2: process (clk) begin

if rst = '1' then count <= 0;

elsif clk'EVENT and clk = '1' then count <= count + inc;

end if ;

end process ;

S3: process (clk, rst) begin

if rst = '1' then count <= 0; elsif clk'EVENT and clk = '1' then

count <= count + inc; sum <= count + sum;

end if ;

end process ;

S4: process (clk) begin

if clk'EVENT and clk = '1' then if rst = '1' then count <= 0;

else count <= count + inc; end if ;

end if ;

end process ;

S5: process (clk, rst) begin

if rst = '1' then count <= 0;

elsif clk'EVENT and clk = '1' then count <= count + inc;

else count <= count + 1;

end if ;

end process ;

S6: process (clk, rst) begin

if rst = '1' then count <= 0;

elsif clk'EVENT and clk = '1' then count <= count + inc;

end if ; inc <= not dec;

end process ;

Write code to drive each of these processes and simulate them. Explain any errors or problems you encounter. Try to synthesize your code and check that the results behave correctly and match the simulation results. Explain any differences in behavior or any problems you encounter.

12.22 (Verilog signed multiplication, 30 min.) Show, by simulation, that the following code performs signed multiplication. Synthesize the code and compare the results with the simulation.

module Smpy (in1, in2, out); input [2:0] in1, in2; output [5:0] out;

assign out = {{3{in1}},in1}*{{3{in2}},in2};

endmodule

12.23  (Verilog arithmetic, 30 min.) Synthesize the following code and explain in detail the implementation that results:

module Arithmetic (in_4, out_2, out_3, out_7, out_14);

input [3:0] in_4; output [7:0] out_2, out_3, out_7, out_14;

assign out_2 = in_4*2; assign out_3 = in_4*3; assign out_7 = in_4*7;

assign out_14 = in_4 * 4'b1110;

endmodule

12.24 (Verilog overflow bit, 15 min.) Synthesize the following code and explain the implementation that results:

module Overflow (a, b, sum, cout);

input [7:0] a, b; output [7:0] sum; output cout;

assign {cout, sum} = a + b;

endmodule

12.25 (*VHDL latches, 60 min.) Consider the following two architectures:

entity latch1 is port (data: in BIT_VECTOR(1 to 4);

reset: in BIT; delay: out BIT_VECTOR(1 to 4));

end latch1;

architecture Synthesis_1 of latch1 is

begin S1: process (data, reset) variable hold : BIT_VECTOR (1 to 4);

begin

if reset = '1' then hold := "0000"; end if ;

delay <= hold; hold := data;

end process ;

end Synthesis_1;

architecture Synthesis_2 of latch1 is

begin S2: process (data, enable, reset)

variable hold : BIT_VECTOR (1 to 4);

begin

if enable = '1' then hold := data; end if ;

delay <= hold;

if reset = '0' then hold := "0000";

end process ;

end Synthesis_2;

Try to synthesize both versions. Does the synthesizer accept the code? Hint: It should not. Explain any problems that you encounter, and how to correct them. Resynthesize your working code.

12.26 (*VHDL data slip, 60 min.) Consider the following process, a shift register core:

S1: process (data, enable) begin

if enable = '1' then Q <= Q(7 downto 0) & data; end if ;

end process ;

Complete the VHDL code and simulate to ensure your model operates correctly. Try to synthesize your code and compare the operation of the resulting implementation with the simulation results. Explain any problems you encounter.

12.27 (**Synchronous logic, hours) Investigate the following alternative ways to synthesize synchronous logic in VHDL. Hint: A few of these methods are illegal in both VHDL-87 and VHDL-93, some methods are only illegal in VHDL-87. Create a table for Q1-Q17 that summarizes your results. Assume all signals are STD_LOGIC . Can you create any more methods (positive-edge only)?

-- Let me count the ways to count.

-- Using wait statement:

process begin wait on clk; Q1 <= D; end process ; -- 2 edges

process begin wait on clk until clk = '1'; Q2 <= D; end process ;

process begin wait until clk = '1'; Q3 <= D; end process ;

process begin wait until clk = '1' and clk'EVENT; Q4 <= D;

end process ;

-- Using process and sensitivity list:

process (clk) begin if clk'EVENT and clk = '1' then Q5 <= D; end if ;

end process ;

process (clk) begin if not clk'STABLE and clk = '1' then Q6 <= D;

end if ; end process ;

process (clk) begin

if clk'LAST_VALUE = '0' and clk = '1' then Q7 <= D; end if ;

end process ;

-- Using rising_edge function from STD_LOGIC_1164:

process (clk) begin if rising_edge(clk) then Q8 <= D; end if ;

end process ;

process begin wait until rising_edge(clk); Q9 <= D; end process ;

process begin wait on rising_edge(clk); Q10 <= D; end process ;

-- rising_edge expanded:

process (clk) begin

if clk'EVENT and To_X01(clk) = '1'

and To_X01(clk'LAST_VALUE) = '0' then Q11 <= D; end if ;

end process ;

-- Using concurrent signal assignments:

Q12 <= D when clk'EVENT and clk = '1'; -- VHDL-93 only (...else)

Q13 <= D when clk'EVENT and clk = '1' else Q13; -- need buffer

Q14 <= D when clk'EVENT and clk = '1' else unaffected ; -- VHDL-93

Q15 <= D when clk'EVENT and clk = '1'

else Q15'DRIVING_VALUE; -- VHDL-93

-- Using blocks:

F1: block ( not clk'STABLE and clk = '1')

begin Q16 <= guarded D; end block ;

F2: block (clk'EVENT and clk = '1')

begin Q17 <= guarded D; end block ;

-- The bizarre and variations using '0', 'L', 'H', and '1':

process (clk) begin

if clk'LAST_VALUE = 'L' and clk = 'H' or clk = '1' then Q18 <= D;

end if ; end process ;

process begin wait until clk = 'H' or clk = '1';

Q19 <= D; end process ;

-- More?

12.28 (*State assignment, 30 min) If we have a state machine with r states and S 0 variables, how many different state assignments are there, for S 0 = 1 and r = 2? List the different state assignments with S 0 = 2, r = 3 and for S 0 = 2, r = 4. How many of these are distinct? For five states and three state variables there are 6720 different state assignments, of which 140 are distinct. For nine states and four state variables there are over 4 ¥ 10 9 different possible state assignments and nearly 11 million of these are distinct. This makes the task of performing sequential logic synthesis by exhaustively considering all possible state assignments virtually impossible. Hint: McCluskey’s book discusses the problem of state assignment [ 1965, pp. 266–267].

12.29 (*Synthesis scripts, hours) Write and document a script to synthesize the Viterbi decoder using a logic synthesizer of your choice.

12.30 (*Floorplanning, hours) Write and document a script to perform timing-driven synthesis and floorplanning for the Viterbi decoder.

12.31 (***Patents, 120 min.) Obtain a copy of U.S. Patent 5,530,841 “Method for converting a hardware independent user description of a logic circuit into hardware components.” This patent caused controversy during the approval of the IEEE synthesis packages. Research this topic (including a visit to the Web site of the synthesis package working group and checking other synthesis patents). Do you feel (as an engineer) that the IEEE should be concerned?