📄 ch13.c.htm
字号:
</A>
if (count = 0) then carry <= 1; else carry <= 0; end if;</P>
<P CLASS="Computer">
<A NAME="pgfId=58084">
</A>
end case;</P>
<P CLASS="Computer">
<A NAME="pgfId=58085">
</A>
end if;</P>
<P CLASS="Computer">
<A NAME="pgfId=58086">
</A>
end process;</P>
<P CLASS="ComputerLast">
<A NAME="pgfId=58087">
</A>
end behave;</P>
<P CLASS="ExerciseHead">
<A NAME="pgfId=67569">
</A>
13.27 (***VITAL flip-flop) The following VITAL code models a D flip-flop:</P>
<P CLASS="ComputerFirstLabel">
<A NAME="pgfId=67570">
</A>
LIBRARY ieee; USE ieee.Std_Logic_1164.all; </P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67571">
</A>
USE ieee.Vital_Timing.all; USE ieee.Vital_Primitives.all;</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67572">
</A>
ENTITY dff IS </P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67573">
</A>
GENERIC (</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67574">
</A>
TimingChecksOn : BOOLEAN := TRUE;</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67575">
</A>
XGenerationOn : BOOLEAN := TRUE;</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67576">
</A>
InstancePath : STRING := "*";</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67577">
</A>
tipd_Clock : DelayType01 := (0 ns, 0 ns);</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67578">
</A>
tipd_Data : DelayType01 := (0 ns, 0 ns);</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67579">
</A>
tsetup_Data_Clock : DelayType01 := (0 ns, 0 ns);</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67580">
</A>
thold_Data_Clock : DelayType01 := (0 ns, 0 ns);</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67581">
</A>
tpd_Clock_Q : DelayType01 := (0 ns, 0 ns);</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67582">
</A>
tpd_Clock_Qbar : DelayType01 := (0 ns, 0 ns));</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67583">
</A>
PORT (Clock, Data: Std_Logic; Q,Qbar:OUT Std_Logic);</P>
<P CLASS="ComputerLastLabel">
<A NAME="pgfId=67584">
</A>
END dff;</P>
<P CLASS="ComputerFirstLabel">
<A NAME="pgfId=67586">
</A>
ARCHITECTURE Gate OF dff IS</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67587">
</A>
ATTRIBUTE Vital_Level1 of gate : ARCHITECTURE IS TRUE;</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67588">
</A>
SIGNAL Clock_ipd : Std_Logic := 'X';</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67589">
</A>
SIGNAL Data_ipd : Std_Logic := 'X';</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67590">
</A>
BEGIN</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67591">
</A>
Wire_Delay:BLOCK BEGIN -- INPUT PATH DELAYs</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67592">
</A>
VitalPropagateWireDelay</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67593">
</A>
(Clock_ipd, Clock, VitalExtendToFillDelay(tipd_Clock));</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67594">
</A>
VitalPropagateWireDelay </P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67595">
</A>
(Data_ipd, Data, VitalExtendToFillDelay(tipd_Data));</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67596">
</A>
END BLOCK;</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67597">
</A>
VitalBehavior : PROCESS (Clock_ipd, Data_ipd)</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67598">
</A>
CONSTANT Dff_tab:VitalStateTableType:= (</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67599">
</A>
--Vio CLOCK DATA IQ Q QBAR</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67600">
</A>
( 'X', '-', '-', '-', 'X', 'X' ), -- Timing Violation</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67601">
</A>
( '-', '\', '0', '-', '0', '1' ), -- Active Clock Edge</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67602">
</A>
( '-', '\', '1', '-', '1', '0' ),</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67603">
</A>
( '-', '\', 'X', '-', 'X', 'X' ),</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67604">
</A>
( '-', '-', '0', '0', '0', '1' ), -- X Reduction</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67605">
</A>
( '-', '-', '1', '1', '1', '0' ),</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67606">
</A>
( '-', 'D', '-', '-', 'X', 'X' ), -- X Generation</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67607">
</A>
( '-', 'B', '-', '-', 'S', 'S' ), -- Non-Active Clock Edge</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67608">
</A>
( '-', 'X', '-', '-', 'S', 'S' ));</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67609">
</A>
-- Anything else generates X on Q and QBAR</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67610">
</A>
-- Timing Check Results</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67611">
</A>
VARIABLE Tviol_Data_Clock : X01 := '0';</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67612">
</A>
VARIABLE Tmkr_Data_Clock : TimeMarkerType;</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67613">
</A>
-- Functionality Results</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67614">
</A>
VARIABLE Violation:X01:='0';</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67615">
</A>
VARIABLE PrevData:Std_Logic_Vector(1 to 3):=(OTHERS=>'X');</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67616">
</A>
VARIABLE Results:Std_Logic_Vector(1 to 2):=(OTHERS =>'X');</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67617">
</A>
ALIAS Q_zd:Std_Logic IS Results(1);</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67618">
</A>
ALIAS Qbar_zd:Std_Logic IS Results(2);</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67619">
</A>
-- Output Glitch Detection Variables</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67620">
</A>
VARIABLE Q_GlitchData : GlitchDataType;</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67621">
</A>
VARIABLE Qbar_GlitchData : GlitchDataType;</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67622">
</A>
BEGIN -- Timing Check Section</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67623">
</A>
IF (TimingChecksOn) THEN</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67624">
</A>
VitalTimingCheck (</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67625">
</A>
Data_ipd, "Data", Clock_ipd, "Clock",</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67626">
</A>
t_setup_hi => tsetup_Data_Clock(tr01),</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67627">
</A>
t_setup_lo => tsetup_Data_Clock(tr10),</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67628">
</A>
t_hold_hi => thold_Data_Clock(tr01),</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67629">
</A>
t_hold_lo => thold_Data_Clock(tr10),</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67630">
</A>
CheckEnabled => TRUE,</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67631">
</A>
RefTransition => (Clock_ipd = '0'),</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67632">
</A>
HeaderMsg => InstancePath & "/DFF",</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67633">
</A>
TimeMarker => Tmkr_Data_Clock, </P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67634">
</A>
Violation => Tviol_Data_Clock);</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67635">
</A>
END IF;</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67636">
</A>
-- Functionality Section</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67637">
</A>
Violation := Tviol_Data_Clock ;</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67638">
</A>
VitalStateTable(StateTable => Dff_tab,</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67639">
</A>
DataIn => (Violation, Clock_ipd, Data_ipd),</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67640">
</A>
NumStates => 1,</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67641">
</A>
Result => Results,</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67642">
</A>
PreviousDataIn => PrevData);</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67643">
</A>
-- Path Delay Section</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67644">
</A>
VitalPropagatePathDelay (Q, "Q", Q_zd,</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67645">
</A>
Paths => (0 => (Clock_ipd'LAST_EVENT, </P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67646">
</A>
VitalExtendToFillDelay(tpd_Clock_Q), TRUE),</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67647">
</A>
1 => (Clock_ipd'LAST_EVENT, </P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67648">
</A>
VitalExtendToFillDelay(tpd_Clock_Q), TRUE)),</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67649">
</A>
GlitchData => Q_GlitchData, </P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67650">
</A>
GlitchMode => MessagePlusX, </P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67651">
</A>
GlitchKind => OnEvent );</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67652">
</A>
VitalPropagatePathDelay ( Qbar, "Qbar", Qbar_zd,</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67653">
</A>
Paths => (0 => (Clock_ipd'LAST_EVENT, </P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67654">
</A>
VitalExtendToFillDelay(tpd_Clock_Qbar), TRUE), </P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67655">
</A>
1 => (Clock_ipd'LAST_EVENT, </P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67656">
</A>
VitalExtendToFillDelay(tpd_Clock_Qbar), TRUE)), </P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67657">
</A>
GlitchData => Qbar_GlitchData, </P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67658">
</A>
GlitchMode => MessagePlusX, </P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67659">
</A>
GlitchKind => OnEvent );</P>
<P CLASS="ComputerLabel">
<A NAME="pgfId=67660">
</A>
END PROCESS;</P>
<P CLASS="ComputerLastLabel">
<A NAME="pgfId=67661">
</A>
END Gate;</P>
<UL>
<LI CLASS="ExercisePartFirst">
<A NAME="pgfId=118447">
</A>
a. (120 min.) Build a testbench for this model.</LI>
<LI CLASS="ExercisePart">
<A NAME="pgfId=118450">
</A>
b. (30 min.) Simulate and check the model using your testbench. </LI>
<LI CLASS="ExercisePart">
<A NAME="pgfId=118451">
</A>
c. (60 min.) Explain the function of each line.</LI>
<LI CLASS="ExercisePart">
<A NAME="pgfId=118452">
</A>
d. (60 min.) Explain the glitch detection. </LI>
<LI CLASS="ExercisePart">
<A NAME="pgfId=118453">
</A>
e. (120 min.) Explain the unknown propagation behavior.</LI>
</UL>
<P CLASS="ExerciseHead">
<A NAME="pgfId=68242">
</A>
13.28 (VCD, 30 min.) Verilog can create a <SPAN CLASS="Definition">
value change dump </SPAN>
<A NAME="marker=76322">
</A>
(<SPAN CLASS="Definition">
VCD</SPAN>
<A NAME="marker=76323">
</A>
<A NAME="marker=76324">
</A>
) file:</P>
<P CLASS="ComputerFirst">
<A NAME="pgfId=68243">
</A>
<B CLASS="Keyword">
module</B>
waves; <B CLASS="Keyword">
reg</B>
clock; <B CLASS="Keyword">
integer</B>
count;</P>
<P CLASS="Computer">
<A NAME="pgfId=68244">
</A>
<B CLASS="Keyword">
initial</B>
<B CLASS="Keyword">
begin </B>
clock = 0; count = 0; $dumpvars; #340 $finish; <B CLASS="Keyword">
end</B>
</P>
<P CLASS="Computer">
<A NAME="pgfId=68245">
</A>
<B CLASS="Keyword">
always</B>
#10 clock = ~ clock;</P>
<P CLASS="Computer">
<A NAME="pgfId=68246">
</A>
<B CLASS="Keyword">
always begin </B>
@ (<B CLASS="Keyword">
negedge</B>
clock); <B CLASS="Keyword">
if</B>
(count == 7) count = 0;</P>
<P CLASS="Computer">
<A NAME="pgfId=68247">
</A>
<B CLASS="Keyword">
else </B>
count = count + 1; <B CLASS="Keyword">
end</B>
</P>
<P CLASS="ComputerLast">
<A NAME="pgfId=68248">
</A>
<B CLASS="Keyword">
endmodule</B>
</P>
<P CLASS="ExerciseNoIndent">
<A NAME="pgfId=68252">
</A>
A VCD file contains header information, variable definitions, and the value changes for variables [Verilog LRM 15]. Try and explain the format of the file that results.</P>
<P CLASS="ExerciseHead">
<A NAME="pgfId=100551">
</A>
13.29 <A NAME="20482">
</A>
(*Formal verification, 60 min.) (Based on an example by Browne, Clarke, Dill, and Mishra.) A designer needs to fold an 8-bit ripple-carry adder into a small space on an ASIC and check the circuit extracted from the layout. With two 8-bit inputs, <SPAN CLASS="BodyComputer">
A</SPAN>
and <SPAN CLASS="BodyComputer">
B</SPAN>
, and a 1-bit carry <SPAN CLASS="BodyComputer">
Cin</SPAN>
, exhaustively testing all possible inputs requires 2<SUP CLASS="Superscript">
17</SUP>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -