Verilog Tutorial
Verilog Tutorial
اﺳﻔﻨﺪ ٧٩
ﺧﻮدآﻣـﻮز زﺑـﺎن ﺗﻮﺻﻴـﻒ ﺳــﺨﺖاﻓﺰاري Verilog
ﺗﻬﻴﻪ ﻛﻨﻨﺪه :ﺳــﻌﻴﺪ ﺻﻔـﺮي
ﻣﺎﺟﻮل ١-١
ﻣـﺎﺟﻮل ﺑﻠـﻮك ﭘﺎﻳـﺔ Verilogاﺳـﺖ .ﻳـﻚ ﻣـﺎﺟﻮل ﻣﻲﺗﻮاﻧـﺪ ﻳـﻚ ﻋﻨﺼـﺮ ﻳـﺎ ﻣﺠﻤﻮﻋـﻪاي از ﺑﻠﻮﻛـــﻬﺎي
ﺳﻄﺢ ﭘــﺎﻳﻴﻦﺗﺮ ﺑﺎﺷـﺪ .ﺑﻨـﺎﺑﺮاﻳﻦ ﻣـﺎﺟﻮل ﻋﻤﻠﻜـﺮد ﻣـﻮرد ﻧﻈـﺮ را ﺑـﺮاي ﺑﻠﻮﻛـﻬﺎي ﺳـﻄﺢ ﺑـﺎﻻﺗﺮ ﻓﺮاﻫـﻢ ﻣﻲﻛﻨـﺪ ،اﻣـﺎ
ﭘﻴﺎدهﺳﺎزي داﺧﻞ آﻧـﺮا ﭘﻨـﻬﺎن ﻣﻲﻛﻨـﺪ .ﺷـﻜﻞ ١-١ﻧﺤـﻮة ﺗﻌﺮﻳـﻒ ﻣـﺎﺟﻮل را ﺑـﺎ ﻳـﻚ ﻣﺜـﺎل ﺑﻴـﺎن ﻣﻲﻛﻨـﺪ .در زﺑـﺎن
Verilogﻣﻲﺗﻮاﻧﻴﻢ ﻳﻚ ﻣــﺎﺟﻮل را در ﭼـﻬﺎر ﺳـﻄﺢ ﻣﺨﺘﻠـﻒ ﺗﺠﺮﻳـﺪ ﺑﻴـﺎن ﻛﻨﻴـﻢ :
• ﺳﻄﺢ ﮔﻴﺖ :در اﻳﻦ ﺳﻄﺢ ﻣــﺎﺟﻮل ﺑﺼـﻮرت ﮔﻴﺘـﻬﺎي ﻣﻨﻄﻘـﻲ و اﺗﺼـﺎﻻت ﺑﻴـﻦ آﻧـﻬﺎ ﺑﻴـﺎن ﻣﻲﺷـﻮد.
• ﺳـﻄﺢ ﺟﺮﻳـﺎن داده ) : (Dataflowدر اﻳـﻦ ﺳـﻄﺢ ﻣـﺎﺟﻮل ﺑﻮﺳـﻴﻠﺔ ﻣﺸـﺨﺺ ﻛـﺮدن ﻧﺤـﻮة ﺟﺮﻳـــﺎن
اﻃﻼﻋﺎت ﺑﻴﻦ رﺟﻴﺴﺘﺮﻫﺎ و ﻧﻮع ﭘﺮدازﺷــﻲ ﻛـﻪ روي آﻧـﻬﺎ ﺻـﻮرت ﻣـﻲﮔـﻴﺮد ،ﺑﻴـﺎن ﻣﻲﺷـﻮد.
• ﺳـﻄﺢ رﻓﺘـﺎري ) : (Behavioralدر اﻳـﻦ ﺳـﻄﺢ ﻣـﺎﺟﻮل ﺑﺮﺣﺴـﺐ اﻟﮕﻮرﻳﺘـﻢ ﻃﺮاﺣـﻲ ﺷـﻮد ،ﺑــﺪون
اﻳﻨﻜﻪ ﺟﺰﺋﻴﺎت ﻃﺮاﺣــﻲ ﭘﻴﺎدهﺳـﺎزي ﺳـﺨﺖاﻓﺰاري در ﻧﻈـﺮ ﮔﺮﻓﺘـﻪ ﺷـﻮد.
• ﺳﻄﺢ ﺳﻮﺋﻴﭻ :در اﻳﻦ ﺳﻄﺢ ﻣــﺎﺟﻮل ﺑﺼـﻮرت ﺳـﻮﺋﻴﭽﻬﺎ و اﺗﺼـﺎﻻت ﺑﻴـﻦ آﻧـﻬﺎ ﺑﻴـﺎن ﻣﻲﺷـﻮد.
ﻧﻤﻮﻧﻪ ٢-١
ﻳـﻚ ﻣـﺎﺟﻮل اﻟﮕﻮﻳـﻲ از ﻳـﻚ ﻋﻨﺼـﺮ واﻗﻌـﻲ ﻣﻲﺳـﺎزد ،ﻫﻨﮕﺎﻣﻴﻜـــﻪ از اﻳــﻦ ﻣــﺎﺟﻮل اﺳــﺘﻔﺎده ﻣﻲﺷــﻮد،
Verilogﻳﻚ ﻧﻤﻮﻧــﻪ از اﻳـﻦ اﻟﮕـﻮ ﻣﻲﺳـﺎزد .ﻫـﺮ ﻋﻨﺼـﺮ داراي ﻧـﺎم ،ﻣﺘﻐﻴﺮﻫـﺎ و ﭘﺎراﻣﺘﺮﻫـﺎي ﺧـﺎص ﺧـﻮد اﺳـﺖ.
ﭘﺮوﺳﺔ اﻳﺠــﺎد ﻳـﻚ ﻧﻤﻮﻧـﻪ از اﻟﮕـﻮي ﻳـﻚ ﻣـﺎﺟﻮل را اﺻﻄﻼﺣـﺎ Instantiationﻳـﺎ ﻧﻤﻮﻧﻪﺳـﺎزي و اﻳـﻦ ﻋﻨﺼـﺮ را
Instanceﻳـﺎ ﻧﻤﻮﻧـﻪ ﻣﻲﻧـﺎﻣﻨﺪ .ﺑﻌﻨـﻮان ﻣﺜـــﺎل در ﺷــﻜﻞ ٢-١ﻧﺤــﻮة ﺳــﺎﺧﺖ ﻳــﻚ ﻧﻤﻮﻧــﻪ از روي ﻣــﺎﺟﻮل
دﻳﻜﻮدر را ﻣﻲﺑﻴﻨﻴــﻢ.
ﺧﻮدآﻣـﻮز زﺑـﺎن ﺗﻮﺻﻴـﻒ ﺳــﺨﺖاﻓﺰاري Verilog
ﺗﻬﻴﻪ ﻛﻨﻨﺪه :ﺳــﻌﻴﺪ ﺻﻔـﺮي
Top-Level Cicuit
dcd0
a d0
A D0
b d1
B D1
Circuit d2 Circuit
D2
en d3
En D3
The nets are used to model an
electrical connection between
structural entities such as gates.
;module Top A wire is one type of net.
;wire a, b, en
;wire d0, d1, d2, d3
• در ﺷﻜﻞ زﻳﺮ ﻳﻚ ﻣﻘﺎﻳﺴﻪﮔﺮ ﺑﻴﺘﻲ ﻧﺸﺎن داده ﺷﺪه اﺳﺖ .ﻳﻚ ﻣﺎﺟﻮل ﺑﻨــﺎم Comparator
ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ و ﺳﭙﺲ ﻳﻚ ﻧﻤﻮﻧﻪ ﺑﻨﺎم Comp0از روي آن ﺑﺴﺎزﻳﺪ .دﻗﺖ ﻛﻨﻴﺪ ﻫﺪف ﻓﻘــﻂ
ﺗﻌﺮﻳﻒ ﭘﻮرﺗﻬﺎي ﻣﻘﺎﻳﺴﻪﮔﺮ و ﻧﻤﻮﻧﻪﺳﺎزي از روي آن اﺳﺖ.
Comp0
A a a_gt_b A_GT_B
B b
a_eq_b A_EQ_B
GT gt
a_lt_b A_LT_B
EQ eq
LT lt
ﻣﻘﺎﻳﺴﻪﮔﺮ ﺑﻴﺘﻲ
ﺗﻮﺿﻴﺤﺎت ٢-٢
ﺗﻮﺿﻴﺤـﺎت ﺑـﺮاي ﺧﻮاﻧـﺎﺗﺮ ﻛـﺮدن ﻃـﺮح ﺑﻜـﺎر ﻣﻲروﻧـﺪ و ﺑـــﻪ دوﺻــﻮرت ﻳــﻚ وﭼﻨﺪﺧﻄــﻲ اﺳــﺘﻔﺎده
ﻣﻲﺷﻮد .ﺗﻮﺿﻴﺤﺎت ﻧﻤﻲﺗﻮاﻧﻨــﺪ ﺑﺼـﻮرت ﺗﻮدرﺗـﻮ اﺳـﺘﻔﺎده ﺷـﻮﻧﺪ.
اﭘﺮاﺗﻮرﻫﺎ ٣-٢
اﭘﺮاﺗﻮرﻫﺎ ﺑــﻪ ﺳـﻪ دﺳـﺘﻪ ﻳﮕـﺎﻧﻲ ،دوﺗـﺎﻳﻲ و ﺳـﻪﺗﺎﻳﻲ ﺗﻘﺴـﻴﻢ ﻣﻲﺷـﻮﻧﺪ و ﺑـﻪ ﺗﺮﺗﻴـﺐ داراي ﻳـﻚ ،دو و ﺳـﻪ
اﭘﺮﻧﺪ ﻫﺴــﺘﻨﺪ.
• ﻋـﺪد ﺑـﺪون اﻧـﺪازه :ﺷـﻜﻞ ﻛﻠـﻲ ﻋـﺪد ﺑـﺪون اﻧـﺪازه ﺑﺼـﻮرت ’> <radix><numberاﺳـــﺖ .در
اﻳﻦ ﺣﺎﻟﺖ ﻃﻮل ﻋﺪد ﺑﻪ ﻧــﻮع ﭘﻴﺎدهﺳـﺎزي ﺑﺴـﺘﮕﻲ دارد وﻟـﻲ ﺣﺪاﻗـﻞ ٣٢ﺑﻴـﺖ اﺳـﺖ.
• اﻋﺪاد ﻣﻨﻔﻲ ﺑﺎ ﻗﺮار دادن ﻳﻚ ﻋﻼﻣﺖ ﻣﻨﻔﻲ )" ("-ﻗﺒﻞ از > <sizeﺑﺪﺳﺖ ﻣﻲآﻳﻨﺪ.
• ﻛﺮﻛﺘﺮ ؟ و xﻣﻌﺎدﻻ ﺑﻜﺎر ﻣﻲروﻧﺪ.
• در Verilogدوﻧﻤﺎد ﺑﺮاي ﻣﻘﺎدﻳﺮ HiZو ﻧﺎﻣﻌﻠﻮم دارﻳﻢ ﻛﻪ ﺑﻪ ﺗﺮﺗﻴﺐ ﻋﺒــﺎرﺗﻨﺪ از
. x, zاﻳﻦ ﻣﻘﺎدﺑﺮ در ﺷﺒﻴﻪﺳﺎزي ﻣﺪارﻫﺎ ﺑﺴﻴﺎر ﻣﻮرد اﺳــﺘﻔﺎده ﻗـﺮار ﻣـﻲﮔـﻴﺮﻧﺪ .در
ﻣﻘﺪاردﻫﻲ ﺑﻪ ﻳﻚ ﻋﺪد درﻣﺒﻨﺎي ﺷﺎﻧﺰده ،ﻫﺸﺖ و دو ﻣﻘﺎدﻳﺮ x, zﺑــﻪﺗﺮﺗﻴﺐ ﻃﻮﻟـﻲ
ﺑﺮاﺑﺮ ٤و ٣و ١ﺑﻴﺖ دارﻧﺪ.
رﺷﺘﻪ ٥-٢
ﻣﺠﻤﻮﻋﻪاي اﺳﺖ از ﻛﺮﻛﺘﺮﻫــﺎ ﻛـﻪ ﺑﻮﺳـﻴﻠﻪ ”“ ﻣﺤﺼـﻮر ﺷـﺪهاﻧﺪ.
Net ٢-٧-٢
ﺑـﺮاي ﺑﺮﻗـﺮار ﻛـﺮدن ارﺗﺒـﺎط ﺑﻴـﻦ اﺟـﺰاء ﺳـﺨﺖاﻓﺰاري ﺑﻜـﺎر ﻣـﻲرود .درﺳـﺖ ﻣـﺎﻧﻨﺪ ﻣﺪارﻫـﺎي واﻗﻌـــﻲ،
netداراي ﻣﻘـﺪاري اﺳـــﺖ ﻛــﻪ ﺑﻮﺳــﻴﻠﺔ ﺧﺮوﺟــﻲ ﻋﻨﺼــﺮ ﻣﺘﺼــﻞ ﺑــﻪ آن روي آن دراﻳــﻮ ﻣﻲﺷــﻮد net .در
Verilogﺗﻮﺳﻂ ﻛﻠﻤــﺔ ﻛﻠﻴـﺪي wireﺗﻌﺮﻳـﻒ ﻣﻲﺷـﻮد و ﻣﻘـﺪار ﭘﻴـﺶ ﻓـﺮض آن zاﺳـﺖ.
• ﻧﺤـﻮة ﺑﺮﺧـﻮرد ﺑـﺎ zدر ورودﻳـﻬﺎي ﮔﻴﺘـﻬﺎ و ﻋﺒـﺎرات دﻗﻴﻘـﺎ ﻣـﺎﻧﻨﺪ xاﺳـﺖ ،ﻓﻘـــﻂ
ﺗﺮاﻧﺰﻳﺴﺘﻮرﻫﺎي MOSﺣﺎﻟﺖ zرا ازﺧﻮد ﻋﺒﻮر ﻣﻲدﻫﻨﺪ.
• ﺳﻄﻮح ﻗﺪرت ﺑﺮاي ﺣﻞ ﺗﺼﺎدم ﺑﻴﻦ دو دراﻳﻮر ﻣﺨﺘﻠﻒ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲﺷﻮد.
• اﮔﺮ دو ﺳﻴﮕﻨﺎل ﻧﺎﻣﺴﺎوي ﺑﺎ ﺳﻄﻮح ﻗﺪرت ﻣﺨﺘﻠﻒ ﻳﻚ ﺳﻴﻢ را دراﻳﻮ ﻛﻨﻨﺪ ،ﺳﻴﮕﻨﺎل ﻗﻮﻳـﺘﺮ
ﺑﺮﻧﺪه ﻣﻲﺷﻮد.
• اﮔﺮ دو ﺳﻴﮕﻨﺎل ﻧﺎﻣﺴﺎوي ﺑﺎ ﺳﻄﻮح ﻗﺪرت ﻣﺴﺎوي ﻳــﻚ ﺳـﻴﻢ را دراﻳـﻮ ﻛﻨﻨـﺪ ،ﺣـﺎﺻﻞ
ﻧﺎﻣﻌﻠﻮم ﻣﻲﺷﻮد.
ﺧﻮدآﻣـﻮز زﺑـﺎن ﺗﻮﺻﻴـﻒ ﺳــﺨﺖاﻓﺰاري Verilog
ﺗﻬﻴﻪ ﻛﻨﻨﺪه :ﺳــﻌﻴﺪ ﺻﻔـﺮي
Register ٣-٧-٢
ﺑـﺮاي ذﺧـﻴﺮة اﻃﻼﻋـﺎت ﺑﻜـﺎر ﻣـﻲرود .رﺟﻴﺴـﺘﺮ ﺗـﺎ وﻗﺘـﻲ ﻣﻘـﺪار ﺟﺪﻳـﺪي روي آن ﻧﻮﺷـﺘﻪ ﻧﺸـﺪه ﻣﻘــﺪار
ﺧـﻮد را ﻧﮕـﺎه ﻣـﻲدارد .ﺑﺮﺧـﻼف register ، netﺑـﻪ دراﻳـﻮر ﻧﻴـﺎز ﻧـﺪارد register .در Verilogﺗﻮﺳـــﻂ ﻛﻠﻤــﺔ
ﻛﻠﻴﺪي regﺗﻌﺮﻳــﻒ ﻣﻲﺷـﻮد و ﻣﻘـﺪار ﭘﻴﺶﻓـﺮض آن xاﺳـﺖ.
;reg reset // Declare a variable that can be hold its value
Vector ٤-٧-٢
اﻧـﻮاع دادهاي regو wireﻣﻲﺗﻮاﻧﻨـﺪ ﺑﺼـﻮرت ﺑـــﺮدار ﺗﻌﺮﻳــﻒ ﺷــﻮﻧﺪ .ﺷــﻜﻞ ﻛﻠــﻲ ﺗﻌﺮﻳــﻒ ﺑــﺮدار
ﺑﺼﻮرت زﻳﺮ اﺳــﺖ :
><vector_type> [ MSB : LSB ] <vector_name
;wire [31:0] BusA // Declare a bus that has 32 bit width
;reg [0:40] Vir_Add // virtual address 41 bits wide
• ﺣﻘﻴﻘـﻲ :ﻳـﻚ ﻧـﻮع دادة رﺟﻴﺴـﺘﺮ ﻫﻤـﻪ ﻣﻨﻈـﻮره اﺳـﺖ ﻛـﻪ ﺑـﺮاي ﭘـﺮدازش ﻣﻘـﺎدﻳﺮ ﺻﺤﻴـﺢ اﺳــﺘﻔﺎده
ﻣﻲﺷﻮد .ﻧــﻮع دادهاي ﺻﺤﻴـﺢ ﺗﻮﺳـﻂ ﻛﻠﻤـﺔ ﻛﻠﻴـﺪي integerﺗﻌﺮﻳـﻒ ﻣﻲﺷـﻮد.
• زﻣـﺎن :در Verilogﻳـﻚ ﻧـﻮع دادهاي ﺧـﺎص ﺑـــﺮاي ذﺧــﻴﺮه ﻛــﺮدن زﻣــﺎن ﺷﺒﻴﻪﺳــﺎزي اﺳــﺘﻔﺎده
ﻣﻲﺷﻮد .ﻧﻮع دادهاي زﻣــﺎن ﺑﻮﺳـﻴﻠﻪ ﻛﻠﻤـﻪ ﻛﻠﻴـﺪي timeﺗﻌﺮﻳـﻒ ﻣﻲﺷـﻮد .ﻃـﻮل ﻣﺘﻐـﻴﺮ از ﻧـﻮع زﻣـﺎن
ﺑﻪ ﭘﻴﺎدهﺳﺎزي ﺑﺴــﺘﮕﻲ دارد وﻟـﻲ ﺣﺪاﻗـﻞ ٦٤ﺑﻴـﺖ اﺳـﺖ.
آراﻳﻪ ٨-٢
در Verilogﻣﻲﺗـﻮان آراﻳـﻪاي از ﻧﻮﻋـﻬﺎي دادهاي time, integer, regو ﻳــﺎ آراﻳــﻪاي از ﺑﺮدارﻫــﺎﻳﻲ
از اﻳﻦ ﻧﻮﻋﻬﺎ ﺗﻌﺮﻳﻒ ﻛــﺮد .ﺷـﻜﻞ ﻛﻠـﻲ ﺗﻌﺮﻳـﻒ آراﻳـﻪ ﻋﺒﺎرﺗﺴـﺖ از :
] <array_type> <array_name> [ #first_element : #last_element
ﺣﺎﻓﻈﻪ ٩-٢
در Verilogﺣﺎﻓﻈﻪ را ﺑﺼــﻮرت آراﻳـﻪاي از رﺟﻴﺴـﺘﺮﻫﺎ ﺗﻌﺮﻳـﻒ ﻣﻲﻛﻨﻴـﻢ.
ﭘﺎراﻣﺘﺮ ١٠-٢
ﻣﻲﺗـﻮان در ﻳـﻚ ﻣـﺎﺟﻮل اﻋـﺪاد ﺛـﺎﺑﺘﻲ را ﺑﺼـﻮرت ﭘـﺎراﻣﺘﺮ ﺗﻌﺮﻳـﻒ ﻧﻤـﻮد و از آﻧـﻬﺎ اﺳـﺘﻔﺎده ﻧﻤـﻮد ،اﻳــﻦ
اﻣﺮ ﺗﻮﺳﻂ ﻛﻠﻤــﻪ ﻛﻠﻴـﺪي parameterاﻧﺠـﺎم ﻣﻲﺷـﻮد.
رﺷﺘﻪ ١١-٢
رﺷـﺘﻪﻫﺎ ﻣﻲﺗﻮاﻧﻨـﺪ در ﻳـﻚ regذﺧـﻴﺮه ﺷـﻮﻧﺪ .ﻃـﻮل ﻣﺘﻐـﻴﺮ regﺑـﺎﻳﺪ ﺑـﻪ اﻧـﺪازه ﻛـﺎﻓﻲ ﺑـﺰرگ ﺑﺎﺷـﺪ ﺗــﺎ
ﺑﺘﻮاﻧﺪ رﺷﺘﻪ را ﻧﮕﺎه دارد .ﻫــﺮ ﻛﺮﻛـﺘﺮ در ٨ﺑﻴـﺖ ذﺧـﻴﺮه ﻣﻲﺷـﻮد.
• ﻧﻤـﺎﻳﺶ اﻃﻼﻋـﺎت :ﻧﻤـﺎﻳﺶ اﻃﻼﻋـﺎت ﺗﻮﺳـــﻂ $displayاﻧﺠــﺎم ﻣﻲﺷــﻮد و داراي ﺷــﻜﻞ ﻛﻠــﻲ
;) $display( format, p1, p2, ..., pnاﺳـﺖ ،ﻛـﻪ در آن piﻫـﺎ ﻣﻲﺗﻮاﻧﻨـــﺪ ﻧــﺎم ﻣﺘﻐــﻴﺮ ،ﻧــﺎم
ﺳـﻴﮕﻨﺎل و ﻳـﺎ رﺷـﺘﻪ ﺑﺎﺷـﻨﺪ .ﺗﻮﺳـﻂ formatﻣﻲﺗـﻮان ﻗـﺎﻟﺐ ﻧﻤـﺎﻳﺶ اﻃﻼﻋـﺎت را ﺑﺼـﻮرت دﻟﺨــﻮاه
ﺗﻌﻴﻴﻦ ﻧﻤــﻮد .ﺑـﺮاي اﻳـﻦ ﻣﻨﻈـﻮر ﻳـﻚ ﺳـﺮي ﻗـﺎﻟﺐ از ﭘﻴـﺶ ﺗﻌﺮﻳـﻒ ﺷـﺪه اﺳـﺖ ﻛـﻪ ﻟﻴﺴـﺖ آﻧـﻬﺎ در
ﺟﺪول ٣-١آﻣــﺪه اﺳـﺖ.
Format Display
%d or %D Display variable in decimal
%b or %B Display variable in binary
%s or %S Display string
%h or %H Display variable in hex
%c or %C Display ASCII character
%v or %V Display strength
%o or %O Display variable in octal
%t or %T Display in current time format
%e or %E Display real number in scientific format
%f or %F Display real number in decimal format
%g or %G Display real number in scientific or decimal format, whichever is
shorter
ﺟﺪول -٣-١ﻟﻴﺴﺖ ﻣﺸﺨﺼﺎت ﻗﺎﻟﺒﻬﺎ
• ﻣـﺎﻧﻴﺘﻮرﻛﺮدن اﻃﻼﻋـﺎت :ﻣـﺎﻧﻴﺘﻮرﻛﺮدن اﻃﻼﻋـﺎت ﺗﻮﺳـﻂ $monitorاﻧﺠـﺎم ﻣﻲﺷـﻮد و داراي ﺷـــﻜﻞ ﻛﻠــﻲ
;) $monitor( format, p1, p2, ..., pnاﺳـﺖ ،ﻛـﻪ در آن piﻫـﺎ ﻣﻲﺗﻮاﻧﻨـﺪ ﻧـﺎم ﻣﺘﻐـﻴﺮ ،ﻧـﺎم ﺳـﻴﮕﻨﺎل و ﻳـﺎ
رﺷـﺘﻪ ﺑﺎﺷـﻨﺪ .ﺗﻔـﺎوت ﻧﻤـﺎﻳﺶ اﻃﻼﻋــﺎت ﺑــﺎ ﻣــﺎﻧﻴﺘﻮرﻛﺮدن اﻃﻼﻋــﺎت در اﻳﻨﺴــﺘﻜﻪ $display ،ﺑــﺎ ﻫﺮﺑــﺎر
ﻓﺮاﺧﻮاﻧـﻲ ﻳـﻚ ﻣﺮﺗﺒـــﻪ ﻣﻘــﺎدﻳﺮ ﭘﺎراﻣﺘﺮﻫــﺎﻳﺶ را ﻧﺸــﺎن ﻣﻲدﻫــﺪ وﻟــﻲ $monitorﺑﻄــﻮر داﺋــﻢ ﻣﻘــﺎدﻳﺮ
ﭘﺎراﻣﺘﺮﻫـﺎﻳﺶ را ﻣـﺎﻧﻴﺘﻮر ﻣﻲﻛﻨـﺪ و ﺑـﻪ ﻣﺤـﺾ ﺗﻐﻴـﻴﺮ ﻳﻜـﻲ از ﭘﺎراﻣﺘﺮﻫـﺎي آن ،ﻣﻘـﺎدﻳﺮ ﻛﻠﻴـﺔ ﭘﺎراﻣﺘﺮﻫـــﺎﻳﺶ را
ﻧﺸﺎن ﻣﻲدﻫﺪ .ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷــﺖ ﻛـﻪ در ﻫﺮﻟﺤﻈـﻪ ﻓﻘـﻂ ﻳـﻚ $monitorﻣﻲﺗﻮاﻧـﺪ ﻓﻌـﺎل ﺑﺎﺷـﺪ ،ﺑﻨـﺎﺑﺮاﻳﻦ اﮔـﺮ
ﭼﻨﺪﻳـﻦ دﺳـﺘﻮر $monitorداﺷـﺘﻪ ﺑﺎﺷـﻴﻢ ،ﻓﻘـﻂ آﺧﺮﻳـﻦ دﺳـﺘﻮر $monitorﻓﻌـﺎل اﺳـﺖ .ﺗﻮﺳـــﻂ دو task
ﺑـﻪ ﻧﺎﻣـﻬﺎي $monitoronو $monitoroffﻣﻲﺗـﻮان ﻋﻤﻠﻴـﺎت ﻣـﺎﻧﻴﺘﻮر ﻛـﺮدن اﻃﻼﻋـﺎت را ﺑـﻪ ﺗﺮﺗﻴـﺐ ﻓﻌـــﺎل
و ﻏﻴﺮﻓﻌﺎل ﻧﻤــﻮد.
• ﺗﻮﻗﻒ و ﺧﺎﺗﻤــﺔ ﺷﺒﻴﻪﺳـﺎزي :ﺗﻮﺳـﻂ $stopﻣﻲﺗـﻮان ﻋﻤﻠﻴـﺎت ﺷﺒﻴﻪﺳـﺎزي را ﻣﺘﻮﻗـﻒ ﻧﻤـﻮد و آﻧـﺮا در ﻣـﺪ
interactiveﻗــﺮارداد .اﻳــﻦ ﻣــﺪ ﺑــﺮاي ﻋﻴﺐﻳــﺎﺑﻲ ﺑﻜــﺎر ﻣــﻲرود .ﺗﻮﺳــﻂ $finishﻣﻲﺗــﻮان ﻋﻤﻠﻴـــﺎت
ﺷﺒﻴﻪﺳـﺎزي را ﺧﺎﺗﻤــﻪ داد.
ﻣﺎﺟﻮل ٣
ﻗﺒـﻼ ﻧﺤـﻮة ﺗﻌﺮﻳـﻒ و ﻧﻤﻮﻧﻪﺳـﺎزي ﻣـﺎﺟﻮل را دﻳﺪﻳـﻢ ،در اﻳﻨﺠـﺎ ﺑﺼـﻮرت دﻗﻴﻘـﺘﺮ اﺟـﺰا ﻣـﺎﺟﻮل را ﻣــﻮرد
ﺑﺮرﺳﻲ ﻗــﺮار ﻣﻲدﻫﻴـﻢ .در ﺷـﻜﻞ ٣-١اﺟـﺰا ﻣـﺎﺟﻮل ﻣﺸـﺨﺺ ﺷـﺪه اﺳـﺖ .ﻗﺴـﻤﺘﻬﺎﻳﻲ ﻛـﻪ ﺑﺼـﻮرت زﻳﺮﺧـﻂدار
ﻧﻮﺷـﺘﻪ ﺷـﺪهاﻧﺪ ،در ﺗﻌﺮﻳـﻒ ﻣـﺎﺟﻮل ﺿـﺮوري و ﺳـﺎﻳﺮ ﻗﺴـﻤﺘﻬﺎ اﺧﺘﻴـﺎري اﺳـﺖ .ﻗﺴـﻤﺘﻬﺎﻳﻲ ﻛـﻪ ﺑﺪﻧـﺔ ﻣــﺎﺟﻮل را
ﺗﺸﻜﻴﻞ ﻣﻲدﻫﻨﺪ ،ﻣﻲﺗﻮاﻧﻨﺪ ﺑﺎ ﻫــﺮ ﺗﺮﺗﻴﺒـﻲ در ﺗﻌﺮﻳـﻒ ﻣـﺎﺟﻮل اﺳـﺘﻔﺎده ﺷـﻮﻧﺪ.
endmodule
ﭘﻮرت ٤
ﭘﻮرﺗﻬﺎي ﻳﻚ ﻣﺎﺟﻮل ،واﺳﻂ ارﺗﺒــﺎﻃﻲ ﻣـﺎﺟﻮل ﺑـﺎ ﺟـﻬﺎن ﺧـﺎرج اﺳـﺖ.
fulladd4
a sum
• ﻛﻠﻴﺔ ﭘﻮرﺗﻬﺎ ﺑﻄﻮر ﺿﻤﻨﻲ ﺑﺼﻮرت wireﺗﻌﺮﻳﻒ ﻣﻲﺷﻮﻧﺪ ،ﻣﮕﺮ اﻳﻨﻜــﻪ ﺑﺨﻮاﻫﻴـﻢ
ﻳﻚ ﺧﺮوﺟﻲ ﻣﻘﺪارش را ﻧﮕﺎهدارد ﻛﻪ در اﻳﻨﺼــﻮرت آﻧـﺮا از ﻧـﻮع regﺗﻌﺮﻳـﻒ
ﻣﻲﻛﻨﻴﻢ.
ﺑﻌﻨﻮان ﻣﺜﺎل در ﻣﻮرد ﺟﻤﻊﻛﻨﻨﺪة ﺷــﻜﻞ ٤-١ﺗﻌﺮﻳـﻒ ﭘﻮرﺗـﻬﺎ ﺑﺼـﻮرت زﻳـﺮ اﺳـﺖ.
endmodule
• ﭘﻮرﺗـﻬﺎي دوﺳـﻮﻳﺔ ﻣـﺎﺟﻮل ﺑـﺎﻳﺪ از ﻧـﻮع netﺑﺎﺷـﻨﺪ و اﻳـﻦ ﭘﻮرﺗـﻬﺎ ﻣﻲﺗﻮاﻧﻨـﺪ ﺑـﻪ ﻣﺘﻐﻴﺮﻫـﺎﻳﻲ از ﻧـــﻮع
regو ﻳﺎ netدرﺟــﻬﺎن ﺧـﺎرج ﻣﺘﺼـﻞ ﺷـﻮﻧﺪ.
• ﭘﻮرﺗﻬﺎي ﻣﺎﺟﻮل و ﻣﺘﻐﻴﺮﻫﺎي ﺧﺎرﺟﻲ ﻣﺘﺼــﻞ ﺑـﻪ آﻧـﻬﺎ ﺑـﺎﻳﺪ از ﻧﻈـﺮ ﻃـﻮل ﻣﻨﻄﺒـﻖ ﺑﺎﺷـﻨﺪ.
در Verilogﺑﻪ دو ﺻﻮرت ﻣﻲﺗﻮان ارﺗﺒــﺎط ﭘﻮرﺗـﻬﺎ را ﺑـﺎ ﺟـﻬﺎن ﺧـﺎرج ﺑﺮﻗـﺮار ﻧﻤـﻮد :
-١اﺗﺼﺎل ﺗﺮﺗﻴﺒـﻲ :در اﻳـﻦ روش ﺑـﻪ ﻫﻨﮕـﺎم ﻧﻤﻮﻧﻪﺳـﺎزي از ﻳـﻚ ﻣـﺎﺟﻮل ،ﻣﺘﻐﻴﺮﻫـﺎي ﻣﺘﺼـﻞ ﺑـﻪ ﭘﻮرﺗـﻬﺎ
را دﻗﻴﻘـﺎ ﺑـﻪ ﻫﻤـﺎن ﺗﺮﺗﻴﺒـﻲ ﻛـﻪ در ﺗﻌﺮﻳـﻒ ﻣـﺎﺟﻮل آﻣﺪهاﻧـﺪ ،ﺑﻴـﺎورﻳﻢ .در اﻳـﻦ روش اﮔـﺮ ﺑﺨﻮاﻫﻴـﻢ ﻳـﻚ ﭘــﻮرت
ﺧﺮوﺟﻲ ﺑﻪ ﺟﺎﻳﻲ ﻣﺘﺼــﻞ ﻧﺒﺎﺷـﺪ ﻛﺎﻓﻴﺴـﺖ ﺟـﺎي آن را در ﻟﻴﺴـﺖ ﺧـﺎﻟﻲ ﺑﮕﺬارﻳـﻢ.
-٢اﺗﺼﺎل از ﻃﺮﻳﻖ ﻧﺎم :در اﻳﻦ روش ﺑــﺮاي اﺗﺼـﺎل ﻫـﺮ ﭘـﻮرت از ﻗـﺎﻟﺐ زﻳـﺮ اﺳـﺘﻔﺎده ﻣﻲﻛﻨﻴـﻢ :
).port_name(external_signal_name
از اﻳﻦ روش وﻗﺘﻲ اﺳﺘﻔﺎده ﻣﻲﻛﻨﻴــﻢ ﻛـﻪ ﺗﻌـﺪاد ﭘﻮرﺗـﻬﺎ زﻳـﺎد ﺑﺎﺷـﺪ و ﺑﺨـﺎﻃﺮ ﺳـﭙﺮدن ﺗﺮﺗﻴـﺐ آﻧـﻬﺎ دﺷـﻮار
ﺑﺎﺷﺪ .در اﻳﻦ روش اﮔﺮ ﺑﺨﻮاﻫﻴﻢ ﻳﻚ ﭘــﻮرت ﺧﺮوﺟـﻲ ﺑـﻪ ﺟـﺎﻳﻲ ﻣﺘﺼـﻞ ﻧﺒﺎﺷـﺪ ﻛﺎﻓﻴﺴـﺖ ﻧـﺎم آن را ﻧﻴـﺎورﻳﻢ.
net
inout
net
reg or net net reg or net net
input output
module
ﻳﻚ ﻣﺎﺟﻮل ﻣﻘﺎﻳﺴﻪﮔﺮ ﭼﻬﺎرﺑﻴﺘﻲ ﺑﻨﺎم، • ﺑﺎ اﺗﺼﺎل ﭼﻬﺎر ﻣﻘﺎﻳﺴﻪﮔﺮ ﻳﻚ ﺑﻴﺘﻲ ﻣﻄﺎﺑﻖ ﺷﻜﻞ زﻳﺮ
Comparator ﻓﺮض ﻛﻨﻴﺪ ﻛﻪ ﻣﺎﺟﻮل ﻣﻘﺎﻳﺴﻪﮔﺮ ﻳﻚ ﺑﻴﺘﻲ ﺑﻨـﺎم. ﺑﺴﺎزﻳﺪComparator4
. ﻧﺎﻣﮕﺬاري ﻛﻨﻴﺪim8 ﺗﺎim0 ﺳﻴﮕﻨﺎﻟﻬﺎي داﺧﻠﻲ ﻣﻮرد ﻧﻴﺎز را از.ﻣﻮﺟﻮد اﺳﺖ
a[3:0]
b[3:0]
a[0] im0 a[1] im3 a[2] im6 a[3] a_gt_b
a a_gt_b a a_gt_b a a_gt_b a a_gt_b
b[0] b[1] b[2] b[3]
b im1 b im4 b im7 b a_eq_b
a_eq_b a_eq_b a_eq_b a_eq_b
gt
gt gt gt gt
im2 im5 im8 a_lt_b
eq a_lt_b a_lt_b a_lt_b a_lt_b
eq eq eq eq
lt
lt lt lt lt
and 0 1 x z or 0 1 x z xor 0 1 x z
0 0 0 0 0 0 0 1 x x 0 0 1 x x
1 0 1 x x 1 1 1 1 1 1 1 0 x x
x 0 x x x x x 1 x x x x x x x
z 0 x x x z x 1 x x z x x x x
and a1( out, in1, in2 ); // and gate with two inputs
or ( z, i1, i2 ); // or gate with two inputs
xor ( z1, i1, i2, i3, i4 ); // xor gate with four inputs
nand nd( o1, i1, i2, i3 ); // nand gate with three inputs
nor ( out, a, b, c ); // nor gate with three inputs
xnor ( y, a, b, c, d ); // xnor gate with four inputs
ﺑـﻪ اﻳـﻦ ﺗﺮﺗﻴـﺐ. ﭘﻮرت ﺧﺮوﺟﻲ و ﺑﻘﻴــﺔ ﭘﻮرﺗـﻬﺎ ورودي ﻫﺴـﺘﻨﺪ،• ﭘﻮرت اول اﻳﻦ ﮔﻴﺘﻬﺎ
.ﻣﻲﺗﻮان ﮔﻴﺘﻬﺎﻳﻲ ﺑﺎ ﺗﻌﺪاد ورودﻳﻬﺎي دﻟﺨﻮاه داﺷﺖ
ﻣﻲﺗﻮان ﻧﺎم ﻧﻤﻮﻧﻪ را ذﻛﺮ ﻧﻜﺮد ) اﻳﻦ اﻣــﺮ،• ﺑﻪ ﻫﻨﮕﺎم ﻧﻤﻮﻧﻪﺳﺎزي ) اﺳﺘﻔﺎدة ( از اﻳﻦ ﮔﻴﺘﻬﺎ
.( ﺻﺎدق اﺳﺖVerilog در ﻣﻮرد ﺗﻤﺎم اﻟﻤﺎﻧﻬﺎي از ﭘﻴﺶ ﺳﺎﺧﺘﻪ ﺷﺪة
ﺧﻮدآﻣـﻮز زﺑـﺎن ﺗﻮﺻﻴـﻒ ﺳــﺨﺖاﻓﺰاري Verilog
ﺗﻬﻴﻪ ﻛﻨﻨﺪه :ﺳــﻌﻴﺪ ﺻﻔـﺮي
ctrl ctrl
buf out bufif0 0 1 x z bufif1 0 1 x z
0 0 0 0 z L L 0 z 0 L L
1 1 1 1 z H H 1 z 1 H H
x x x x z x x x z x x x
z x z x z x x z z x x x
ctrl ctrl
not out notif0 0 1 x z notif1 0 1 x z
0 1 0 1 z H H 0 z 1 H H
1 0 1 0 z L L 1 z 0 L L
x x x x z x x x z x x x
z x z x z x x z z x x x
• ﭘﻮرت آﺧﺮ ﮔﻴﺘﻬﺎي ، not, bufﭘﻮرت ورودي و ﺑﻘﻴﺔ ﭘﻮرﺗﻬﺎ ﺧﺮوﺟﻲ ﻫﺴــﺘﻨﺪ .ﺑـﻪ اﻳـﻦ
ﺗﺮﺗﻴﺐ ﻣﻲﺗﻮان ﮔﻴﺘﻬﺎﻳﻲ ﺑﺎ ﺗﻌﺪاد ﺧﺮوﺟﻴﻬﺎي دﻟﺨﻮاه داﺷﺖ.
• در ﻣﻮرد ﮔﻴﺘﻬﺎي دﻳﮕﺮ ﭘﻮرت اول ﺧﺮوﺟﻲ ،ﭘﻮرت ﺑﻌﺪي ورودي و ﭘﻮرت ﺳــﻮم ﻛﻨـﺘﺮل
اﺳﺖ.
• Lﺑﻪ ﻣﻌﻨﺎي 0ﻳﺎ zو Hﺑﻪ ﻣﻌﻨﺎي 1ﻳﺎ zﻣﻲﺑﺎﺷﺪ.
ﺑـﺮاي ﻃﺮاﺣـﻲ ﻣـﺪار در ﺳـﻄﺢ ﮔﻴـﺖ ،اﺑﺘـﺪا ﺑـﺎﻳﺪ آﻧـﺮا ﺑﺼـﻮرت ﻣﺠﻤﻮﻋـــﻪاﻳﻲ از ﮔﻴﺘــﻬﺎي ﭘﺎﻳــﻪ درآورد،
ﺳﭙﺲ ﺑﺎ ﺗﻌﺮﻳﻒ netﻫــﺎي ﻣـﻮرد ﻧﻴـﺎز اﻳـﻦ ﮔﻴﺘـﻬﺎي ﭘﺎﻳـﻪ را ﺑـﻪ ﻳﻜﺪﻳﮕـﺮ ﻣﺘﺼـﻞ ﻧﻤـﻮد ،ﺑـﻪ اﻳـﻦ ﻋﻤـﻞ اﺻﻄﻼﺣـﺎ
Wiringﻳـﺎ ﺳـﻢﺑﻨﺪي ﮔﻔﺘـﻪ ﻣﻲﺷـﻮد .اﻛﻨـﻮن ﺑـﺎ ذﻛـﺮ ﭼﻨـﺪ ﻣﺜـﺎل ﻧﺤـﻮة ﻃﺮاﺣـﻲ ﻣـﺪار در ﺳـﻄﺢ ﮔﻴـﺖ را ﺑﻴـــﺎن
ﻣﻲﻛﻨﻴـﻢ.
ﻣﺜﺎل : ١ﻳﻚ ﻣﺎﻟﺘﻲﭘﻠﻜﺴــﺮ ٤ﺑـﻪ ١ﻃﺮاﺣـﻲ ﻛﻨﻴـﺪ.
ﺣﻞ :ﻃﺮح ﺷﻤﺎﺗﻴﻚ ﻣــﺪار در ﺳـﻄﺢ ﮔﻴـﺖ و ﻛـﺪ Verilogﻣﺮﺑـﻮط ﺑـﻪ آن در ﺷـﻜﻞ ٨-١آﻣـﺪه اﺳـﺖ.
• ﺑﺎ اﺳﺘﻔﺎده از ﮔﻴﺘﻬﺎي nandﻳﻚ ﻓﻠﻴﭗﻓﻼپ ﻧﻮع Dﻛﻪ ﺑــﺎ ﻟﺒـﺔ ﺑـﺎﻻروﻧﺪة Clk
ﻋﻤﻞ ﻣﻲﻛﻨﺪ ﺑﺴﺎزﻳﺪ .ورودﻳﻬﺎي ﻣﺪار D, Clkو ﺧﺮوﺟﻴﻬﺎي ﻣــﺪار q, q_bar
ﻣﻲﺑﺎﺷﺪ.
Verilog ﺧﻮدآﻣﻮز زﺑــﺎن ﺗﻮﺻﻴـﻒ ﺳـﺨﺖاﻓﺰاري
ﺳــﻌﻴﺪ ﺻﻔـﺮي:ﺗﻬﻴﻪ ﻛﻨﻨﺪه
i2 // Gate instantiations
y2
not ( s1n, s1 );
not ( s0n, s0 );
i3 y3
and ( y0, i0, s1n, s0n );
and ( y1, i1, s1n, s0 );
s1 and ( y2, i2, s1 , s1n );
s0 and ( y3, i3, s1 , s0 );
endmodule
endmodule
ﻣﺮﺑﻮﻃﻪVerilog ﻧﻘﺸﺔ ﺷﻤﺎﺗﻴﻚ ﻣﻘﺎﻳﺴﻪﮔﺮ ﺗﻚ ﺑﻴﺘﻲ ﻗﺎﺑﻞ ﺗﻮﺳﻌﻪ در ﺳﻄﺢ ﮔﻴﺖ و ﻛﺪ-٩-١ ﺷﻜﻞ
TRise TFall
1 1,x,z
0,x,z 0
;) and #(5) ( o1, i1, i2 // Rise=5, Fall=5, Turn-Off=5
;) and #(4,6) ( o1, i1, i2 // Rise=4, Fall=6, Turn-Off=4
;) and #(4,5,6) ( o1, i1, i2 // Rise=4, Fall=5, Turn-Off=6
• ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﺗﺎﺧﻴﺮ ﮔﻴﺘﻬﺎ ﻓﻘﻂ ﺑﻪ ﻫﻨﮕﺎم ﺷﺒﻴﻪﺳﺎزي ﻣﺪارﻫﺎ ﻣﻔﻴــﺪ ﻫﺴـﺘﻨﺪ ،و
وﻗﺘﻲ ﻫﺪف ﺳﻨﺘﺰ ﻣﺪار ﻣﻲﺑﺎﺷﺪ ﺑﻪ ﻫﻴﭻوﺟﻪ ﻧﺒﺎﻳﺪ از ﺗﺎﺧﻴﺮ در ﺗﻮﺻﻴــﻒ ﻣـﺪار
اﺳﺘﻔﺎده ﺷﻮد.
• در ﻣﻮرد اﻳﻦ دﺳﺘﻮر ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ اﻳﻦ دﺳﺘﻮر ﻫﻤﻮاره ﻓﻌﺎل اﺳﺖ و ﻫﺮﮔﺎه ﻳﻜــﻲ از
اﭘﺮﻧﺪﻫﺎي ﺳﻤﺖ راﺳﺖ دﺳﺘﻮر ﺗﻐﻴﻴﺮ ﻛﻨﺪ ،ﻛﻞ ﻋﺒﺎرت ﺳﻤﺖ راﺳﺖ ﻣﺠﺪدا ارزﻳﺎﺑﻲ ﺷﺪه در
ﻣﺘﻐﻴﺮ ﺳﻤﺖ ﭼﭗ ﻗﺮار ﻣﻲﮔﻴﺮد.
• ﺳﻤﺖ ﭼﭗ اﻳﻦ دﺳﺘﻮر ﺑﺎﻳﺪ ﻳﻚ ﻣﺘﻐﻴﺮ ﻳﺎ ﻳﻚ ﺑﺮدار از ﻧﻮع netو ﻳﺎ اﻟﺤﺎﻗﻲ از اﻳﻦ دو ﻧـﻮع
ﺑﺎﺷﺪ.
;wire out
;assign out = i1 & i2
// are same as
;wire out = i1 & i2
ﺗﺎﺧﻴﺮﻫﺎ ٣-٦
ﻫﻤﺎﻧﻄﻮرﻛﻪ در ﺳﻄﺢ ﮔﻴﺖ دﻳﺪﻳــﻢ ﺗﺎﺧﻴﺮﻫـﺎ ﺑـﺮاي اﻳـﻦ اﺳـﺘﻔﺎده ﻣﻲﺷـﻮﻧﺪ ﻛـﻪ ﻋﻤﻠﻜـﺮد ﻣـﺪار ﺑـﻪ واﻗﻌﻴـﺖ
ﻧﺰدﻳﻜﺘﺮ ﺑﺎﺷﺪ .در ﺳﻄﺢ ﺟﺮﻳــﺎن داده ﻧـﻴﺰ ﻣﻲﺗـﻮان ﺑـﺮاي assignmentﻫـﺎ ﺗـﺎﺧﻴﺮ ﻣﺸـﺨﺺ ﻧﻤـﻮد.
endmodule
o1
5
;wire out
;assign #5 out = i1 & i2
// are same as
;wire #5 out = i1 & i2
wire #5 out;
assign out = i1 & i2;
//---------------------------------------------------------
-7 % 2 // Evaluated to -1, take sign of the first operand
7 % -2 // Evaluated to +1, take sign of the first operand
//---------------------------------------------------------
;A = 2’bx0 ;B = 2’b10
) A && B // Evaluated to x ( Unknown
;x = 4’b1010
&x // Equivalent to 1 & 0 & 1 & 0, Result is 1’b0
|x // Equivalent to 1 | 0 | 1 | 0, Result is 1’b0
^x // Equivalent to 1 ^ 0 ^ 1 ^ 0, Result is 1’b0
ﺣـﺎل ﺳـﻌﻲ ﻣﻲﻛﻨﻴـﻢ ﺑـﺎ ذﻛـﺮ ﭼﻨـﺪ ﻣﺜـﺎل ﺑـﻪ ﻧﺤـﻮة ﻣﺪﻟﺴـﺎزي ﻣﺪارﻫـﺎي دﻳﺠﻴﺘـﺎل در ﺳـﻄﺢ ﺟﺮﻳــﺎن داده
ﺑﭙﺮدازﻳـﻢ.
ﻣﺜﺎل : ١ﻳﻚ ﻣﺎﻟﺘﻲﭘﻠﻜﺴــﺮ ٤ﺑـﻪ ١ﻃﺮاﺣـﻲ ﻛﻨﻴـﺪ.
;) module mux4_to_1 ( out, i0, i1, i2, i3, s1, s0
;output out
;input i0, i1, i2, i3, s1, s0
endmodule
endmodule
endmodule
ﺑﻴﺘـﻲ را ﻣﺤﺎﺳـﺒﻪ ﻣﻲﻛﻨـﺪ٤ ﻳﻚ ﻋﺪد ﺑــﺎﻳﻨﺮي٢ • در ﺷﻜﻞ زﻳﺮ ﻃﺮح ﺷﻤﺎﺗﻴﻚ ﻣﺪاري ﻛﻪ ﻣﻜﻤﻞ
. اﻳﻦ ﻣﺪار را در ﺳﻄﺢ ﺟﺮﻳﺎن داده ﺗﻮﺻﻴﻒ ﻛﻨﻴﺪ.ﻧﺸﺎن داده ﺷﺪه اﺳﺖ
a3 a2 a1 a0
c2 c1
c0 C-1=0
a* 3 a* 2 a *1 a* 0
ﺧﻮدآﻣـﻮز زﺑـﺎن ﺗﻮﺻﻴـﻒ ﺳــﺨﺖاﻓﺰاري Verilog
ﺗﻬﻴﻪ ﻛﻨﻨﺪه :ﺳــﻌﻴﺪ ﺻﻔـﺮي
;module stimulus
;reg a, b, x, y, m
initial
;m = 1’b0
initial
begin
;#10 x = 1’b0
;#10 y = 1’b1
end
initial
begin
;#5 a = 1’b1
;#10 b = 1’b0
end
initial
;#50 $finish
endmodule
;module clock_gen
;reg clk
initial
;clk = 1’b0
initial
;#1000 $finish
endmodule
initial
begin
end
• ﺷﺒﻴﻪﺳﺎز ﻳﻚ دﺳﺘﻮر Nonblockingرا ﺑﺮاي اﺟﺮا زﻣﺎﻧﺒﻨﺪي ﻣﻲﻛﻨﺪ ،ﺳﭙﺲ ﺑــﻪ دﺳـﺘﻮر
ﺑﻌﺪي درون ﺑﻠﻮك ﻣﻲﭘﺮدازد ،ﺑﺪون اﻳﻨﻜﻪ ﻣﻨﺘﻈﺮ ﻛﺎﻣﻞ ﺷﺪن اﺟﺮاي دﺳﺘﻮر ﻗﺒﻠﻲ ﺷﻮد.
• دﺳﺘﻮرات Nonblockingﻣﻲﺗﻮاﻧﻨﺪ ﺑﺼﻮرت ﻣﺆﺛﺮي ﻫﻤﺰﻣﺎﻧﻲ اﻧﺘﻘﺎل اﻃﻼﻋــﺎت را ﻣـﺪل
ﻛﻨﻨﺪ ،زﻳﺮا ﻧﺘﻴﺠﺔ ﻧﻬﺎﺋﻲ ﺑﻪ ﺗﺮﺗﻴﺐ اﺟﺮاي دﺳﺘﻮرات واﺑﺴﺘﻪ ﻧﻴﺴﺖ.
initial
begin
end
ﻛﻨﺘﺮل ﺗﺎﺧﻴﺮ ﺑﺎ ﻗـﺎﻋﺪه :ﻳـﻚ ﺗـﺎﺧﻴﺮ ﻏـﻴﺮ ﺻﻔـﺮ در ﺳـﻤﺖ ﭼـﭗ دﺳـﺘﻮر آورده ﻣﻲﺷـﻮد .دراﻳﻨﺤـﺎﻟﺖ •
ﻋﺒﺎرت ﺳﻤﺖ راﺳــﺖ ﭘـﺲ از ﮔﺬﺷـﺖ زﻣـﺎن ﺗـﺎﺧﻴﺮ ،ﻣﺤﺎﺳـﺒﻪ ﺷـﺪه درون ﻋﺒـﺎرت ﺳـﻤﺖ ﭼـﭗ ﻗـﺮار
ﻣﻲﮔـﻴﺮد.
initial
begin
;x = 0
;#10 y = 1
;#(4:5:6) q=0
end
ﻛﻨـﺘﺮل ﺗـﺎﺧﻴﺮ درون دﺳـﺘﻮر :ﻳـﻚ ﺗـﺎﺧﻴﺮ ﻏـﻴﺮ ﺻﻔـــﺮ در ﺳــﻤﺖ راﺳــﺖ اﭘﺮاﺗــﻮر assignment •
آورده ﻣﻲﺷـﻮد .دراﻳﻨﺤـﺎﻟﺖ ﻋﺒـﺎرت ﺳـﻤﺖ راﺳـﺖ در زﻣـﺎن ﻓﻌﻠـﻲ ﻣﺤﺎﺳـﺒﻪ ﺷـﺪه ،ﭘـــﺲ از ﮔﺬﺷــﺖ
زﻣﺎن ﺗﺎﺧﻴﺮ درون ﻋﺒﺎرت ﺳــﻤﺖ ﭼـﭗ ﻗـﺮار ﻣـﻲﮔـﻴﺮد.
initial
begin
;x = 0 ;z = 0
;y = #5 x + z
end
// Is equivalent to
initial
begin
;x = 0 ;z = 0 ;temp = x + z
;#5 y = temp
end
ﻛﻨﺘﺮل روﻳﺪاد ﺑﺎ ﻧﺎم Verilog :اﻳــﻦ اﻣﻜـﺎن را ﺑـﺮاي ﻣـﺎ ﻓﺮاﻫـﻢ ﺳـﺎﺧﺘﻪ اﺳـﺖ ﻛـﻪ ﻳـﻚ روﻳـﺪاد را •
ﺗﻌﺮﻳﻒ ﻛﻨﻴﻢ و در ﻣﻮﻗــﻊ ﻟـﺰوم آﻧـﺮا ﺗﺮﻳﮕـﺮ ﻛﻨﻴـﻢ .ﺗﻌﺮﻳـﻒ روﻳـﺪاد ﺑـﺎ ﻛﻠﻤـﺔ ﻛﻠﻴـﺪي eventو ﺗﺮﻳﮕـﺮ
ﻛﺮدن آن ﺑــﺎ > -اﻧﺠـﺎم ﻣﻲﺷـﻮد.
ﺧﻮدآﻣـﻮز زﺑـﺎن ﺗﻮﺻﻴـﻒ ﺳــﺨﺖاﻓﺰاري Verilog
ﺗﻬﻴﻪ ﻛﻨﻨﺪه :ﺳــﻌﻴﺪ ﺻﻔـﺮي
;event rec_data
)always @(rec_data
;} ]data_buf = { data[0] , data[1], data[2], data[3
ﻛﻨﺘﺮل ﭼﻨﺪ روﻳﺪاد :ﮔــﺎﻫﻲ اوﻗـﺎت ﭼﻨـﺪ ﺳـﻴﮕﻨﺎل دارﻳـﻢ ﻛـﻪ ﺗﻐﻴـﻴﺮ در ﻳﻜـﻲ از آﻧـﻬﺎ ﺳـﺒﺐ ﺗﺮﻳﮕـﺮ •
ﺷﺪن اﺟﺮاي ﻳﻚ ﻣﺠﻤﻮﻋــﻪ از دﺳـﺘﻮرات ﻣﻲﺷـﻮد .اﻳـﻦ اﻣـﺮ ﺗﻮﺳـﻂ orﻛـﺮدن روﻳﺪادﻫـﺎ ﻳـﺎ ﺳـﻴﮕﻨﺎﻟﻬﺎ
اﻧﺠﺎم ﻣﻲﺷﻮد .ﻟﻴﺴﺖ روﻳــﺪادا ﻳـﺎ ﺳـﻴﮕﻨﺎﻟﻬﺎ ﺑـﻪ Sensitivity Listﻣﺸـﻬﻮر اﺳـﺖ.
always
;wait( count_enable ) #20 count = count + 1
) if( expr
true_st
else
;false_st
• ﻋﺒﺎرت exprﺑﺎ ﺗﻚﺗﻚ ﻣﻮارد ﺑﻴﺖ ﺑﻪ ﺑﻴﺖ ﻣﻘﺎﻳﺴﻪ ﻣﻲﺷﻮد )ﺑﺎ در ﻧﻈﺮﮔﺮﻓﺘﻦ .( x, 1, 0
• اﮔﺮ ﻃﻮل ﻋﺒﺎرت ﺑﺎ ﻣﻮارد ﻣﻮرد ﻣﻘﺎﻳﺴﻪ ﻳﻜﺴﺎن ﻧﺒﺎﺷﺪ ،ﺳﻤﺖ ﭼﭗ ﺟﺰء ﻛﻮﭼﻜﺘﺮ ﺑﺎ ٠ﭘﺮ
ﻣﻲﺷﻮد.
• درﺻﻮرت اﺳﺘﻔﺎده از casexﻣﻘﺎدﻳﺮ z, xﺑﺼﻮرت ﺑﻲاﻫﻤﻴــﺖ ) (d’ont careﺗﻠﻘـﻲ
ﻣﻲﺷﻮﻧﺪ ﻳﻌﻨﻲ در ﻣﻘﺎﻳﺴﻪ ﻧﻘﺸﻲ ﻧﺪارﻧﺪ.
• درﺻﻮرت اﺳﺘﻔﺎده از casezﻣﻘﺪار zﺑﺼﻮرت ﺑﻲاﻫﻤﻴﺖ ) (d’ont careﺗﻠﻘﻲ ﻣﻲﺷﻮد
ﻳﻌﻨﻲ در ﻣﻘﺎﻳﺴﻪ ﻧﻘﺸﻲ ﻧﺪارد.
ﺣﻠﻘﻪﻫﺎ ٦-٧
) while( expr
;st
//---------------------------------------
) for( init; end_cond; chang_control_var
;st
//---------------------------------------
) repeat( number_of_iteration
;st
//---------------------------------------
forever
;st
Task ١-٧-٧
ﺑﻮﺳﻴﻠﺔ task ... endtaskﻣﺸــﺨﺺ ﻣﻲﺷـﻮد .ﻣﻌﻤـﻮﻻ در ﻣـﻮارد زﻳـﺮ اﺳـﺘﻔﺎده ﻣﻲﺷـﻮد.
در ﭘﺮوﺳﻴﺠﺮ ﺗﺎﺧﻴﺮ ،زﻣﺎﻧﺒﻨﺪي و ﻳــﺎ ﻛﻨـﺘﺮل زﻣـﺎن وﺟـﻮد داﺷـﺘﻪ ﺑﺎﺷـﺪ. •
ﭘﺮوﺳﻴﺠﺮ ﭘﺎراﻣﺘﺮ ﺧﺮوﺟﻲ ﻧﺪاﺷﺘﻪ ﺑﺎﺷــﺪ و ﻳـﺎ ﺑﻴـﺶ از ﻳـﻚ ﭘـﺎراﻣﺘﺮ ﺧﺮوﺟـﻲ داﺷـﺘﻪ ﺑﺎﺷـﺪ. •
ﭘﺮوﺳﻴﺠﺮ ﻫﻴــﭻ ﭘـﺎراﻣﺘﺮ ورودي ﻧﺪاﺷـﺘﻪ ﺑﺎﺷـﺪ. •
ﺧﻮدآﻣـﻮز زﺑـﺎن ﺗﻮﺻﻴـﻒ ﺳــﺨﺖاﻓﺰاري Verilog
ﺗﻬﻴﻪ ﻛﻨﻨﺪه :ﺳــﻌﻴﺪ ﺻﻔـﺮي
Function Task
ﻳﻚ ﺗﺎﺑﻊ ﻓﻘﻂ ﻣﻲﺗﻮاﻧﺪ ﺗﻮاﺑﻊ دﻳﮕﺮ را ﻓﻌﺎل ﻛﻨﺪ. ﻳﻚ taskﻣﻲﺗﻮاﻧﺪ ﺗﻮاﺑﻊ و taskﻫﺎي دﻳﮕﺮ را ﻓﻌﺎل ﻛﻨﺪ.
ﻳﻚ ﺗﺎﺑﻊ ﻫﻤﻴﺸﻪ در زﻣﺎن 0اﺟﺮا ﻣﻲﺷﻮد. ﻳﻚ taskﻣﻤﻜﻦ اﺳﺖ در زﻣﺎن 0اﺟﺮا ﻣﻲﺷﻮد.
ﻳﻚ ﺗﺎﺑﻊ ﻧﻤﻲﺗﻮاﻧﺪ ﺗﺎﺧﻴﺮ ،روﻳﺪاد و ﻳﺎﻛﻨﺘﺮل زﻣﺎن داﺷﺘﻪ ﺑﺎﺷﺪ. ﻳﻚ taskﻣﻲﺗﻮاﻧﺪ ﺗﺎﺧﻴﺮ ،روﻳﺪاد و ﻳﺎﻛﻨﺘﺮل زﻣﺎن داﺷﺘﻪ ﺑﺎﺷﺪ.
ﻳﻚ ﺗﺎﺑﻊ ﺣﺪاﻗﻞ ﺑﺎﻳﺪ ﻳﻚ آرﮔﻮﻣﺎن ورودي داﺷﺘﻪ ﺑﺎﺷﺪ. ﻳﻚ taskﻣﻲﺗﻮاﻧﺪ آرﮔﻮﻣﺎﻧﻬﺎي ورودي ،ﺧﺮوﺟﻲ ﻳﺎ دوﺳﻮﻳﻪ
داﺷﺘﻪ ﺑﺎﺷﺪ.
ﻳﻚ ﺗﺎﺑﻊ ﻫﻤﻴﺸﻪ ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ دارد. ﻳﻚ taskﻧﻤﻲﺗﻮاﻧﺪ ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ داﺷﺘﻪ ﺑﺎﺷﺪ.
ﺟﺪول -٦-١ﺗﻔﺎوﺗﻬﺎي Taskو ﺗﺎﺑﻊ
;module operation
;reg [15:0] A, B
;reg [15:0] AB_AND, AB_OR, AB_XOR
endmodule
Function ٢-٧-٧
ﺑﻮﺳﻴﻠﺔ function ... endfunctionﻣﺸـﺨﺺ ﻣﻲﺷـﻮد .ﻣﻌﻤـﻮﻻ در ﻣـﻮارد زﻳـﺮ اﺳـﺘﻔﺎده ﻣﻲﺷـﻮد.
در ﭘﺮوﺳﻴﺠﺮ ﺗﺎﺧﻴﺮ ،زﻣﺎﻧﺒﻨﺪي و ﻳــﺎ ﻛﻨـﺘﺮل زﻣـﺎن وﺟـﻮد ﻧﺪاﺷـﺘﻪ ﺑﺎﺷـﺪ. •
ﭘﺮوﺳﻴﺠﺮ ﻳﻚ ﭘــﺎراﻣﺘﺮ ﺧﺮوﺟـﻲ داﺷـﺘﻪ ﺑﺎﺷـﺪ. •
ﭘﺮوﺳﻴﺠﺮ ﺣﺪاﻗــﻞ ﻳـﻚ ﭘـﺎراﻣﺘﺮ ورودي داﺷـﺘﻪ ﺑﺎﺷـﺪ. •
;function calc_parity
;input [31:0] address
begin
;) module mux4_to_1 ( out, i0, i1, i2, i3, s1, s0
;output out
;reg out
;input i0, i1, i2, i3, s1, s0
) always @( i0 or i1 or i2 or i3 or s1 or s0
begin
} case { s1, s0
;2’b00 : out = i0
;2’b01 : out = i1
;2’b10 : out = i2
;2’b11 : out = i3
;defualt : out = 1’bx
endcase
end
endmodule
endmodule
ﻣﺜﺎل : ٢ﻳﻚ D-FFﺣﺴﺎس ﺑــﻪ ﻟﺒـﻪي ﺑـﺎﻻروﻧﺪه ﺑـﺎ resetآﺳـﻨﻜﺮون ﻃﺮاﺣـﻲ ﻛﻨﻴـﺪ.
Verilog ﺧﻮدآﻣـﻮز زﺑـﺎن ﺗﻮﺻﻴـﻒ ﺳــﺨﺖاﻓﺰاري
ﺳــﻌﻴﺪ ﺻﻔـﺮي:ﺗﻬﻴﻪ ﻛﻨﻨﺪه
endmodule
آﺳــﻨﻜﺮون ﻃﺮاﺣــﻲrst و ﭘﺎﻳــﻪيld, u_d ﺑﻴﺘـﻲ ﺑـﺎ ﭘﺎﻳـﻪﻫﺎي ﺳـﻨﻜﺮون٤ ﻳـﻚ ﺷـﻤﺎرﻧﺪهي: ٣ ﻣﺜـﺎل
. ﻛـﺎر ﻛﻨـﺪclk ﻛﻨﻴﺪ ﻛﻪ ﺑﺎ ﻟﺒــﻪي ﭘـﺎﻳﻴﻦروﻧﺪهي
endmodule
1/0
0/0 init got1
0/0
1/0
0/1
got11 1/0
Verilog ﺧﻮدآﻣﻮز زﺑــﺎن ﺗﻮﺻﻴـﻒ ﺳـﺨﺖاﻓﺰاري
ﺳــﻌﻴﺪ ﺻﻔـﺮي:ﺗﻬﻴﻪ ﻛﻨﻨﺪه
endmodule
. را ﺑـﺎ اﺳـﺘﻔﺎده از ﻣـﺪل ﻫـﺎﻓﻤﻦ ﻣﺪﻟﺴـﺎزي ﻛﻨﻴـﺪ٤ دﻳﺎﮔﺮام ﺣﺎﻟﺖ ﻣﺜــﺎل: ٥ ﻣﺜﺎل
always @( present_state or x )
begin
case ( present_state )
`init : next_state = x ? `got1 : `init;
`got1 : next_state = x ? `got11 : `init;
`got11 : next_state = x ? `got11 : `init;
endcase
end
endmodule
Verilog ﺧﻮدآﻣـﻮز زﺑـﺎن ﺗﻮﺻﻴـﻒ ﺳــﺨﺖاﻓﺰاري
ﺳــﻌﻴﺪ ﺻﻔـﺮي:ﺗﻬﻴﻪ ﻛﻨﻨﺪه
got110 0 got11
1
1 0
endmodule
. را ﺑـﺎ اﺳـﺘﻔﺎده از ﻣـﺪل ﻫـﺎﻓﻤﻦ ﻣﺪﻟﺴـﺎزي ﻛﻨﻴـﺪ٦ دﻳﺎﮔﺮام ﺣﺎﻟﺖ ﻣﺜــﺎل: ٧ ﻣﺜﺎل
endmodule
ﻓـﺮض ﻛﻨﻴـﺪ در ﻳـﻚ ﺳﻴﺴـﺘﻤﻲ ﻳـﻚ ﭘﺮوﺳـﺲ ﺗﻮﻟﻴـﺪ ﻛﻨﻨـﺪه و ﻳـﻚ ﭘﺮوﺳـﺲ ﻣﺼـــﺮف ﻛﻨﻨــﺪه: ٨ﻣﺜـﺎل
ﺳﻴﺴــﺘﻢ ﺑــﻪ. ﺑﻴـﻦ اﻳـــﻦ دو ﭘﺮوﺳــﺲ را ﺑــﻪ ﻧﻮﻋــﻲ ﻣﺪﻟﺴــﺎزي ﻛﻨﻴــﻢHandshake ﻣﻲﺧﻮاﻫﻴـﻢ.وﺟـﻮد دارد
ﭘﺮوﺳـﺲ ﻣﺼـﺮف ﻛﻨﻨـﺪه اﻳــﻦ،اﻳﻨﺼـﻮرت ﻋﻤـﻞ ﻣﻲﻛﻨـﺪ ﻛـﻪ اﺑﺘـﺪا ﭘﺮوﺳـﺲ ﺗﻮﻟﻴﺪﻛﻨﻨـﺪه دادهاي را ﺗﻮﻟﻴـﺪ ﻣﻲﻛﻨـﺪ
ﭘﺮوﺳــﺲ ﺗﻮﻟﻴﺪﻛﻨﻨــﺪه دادة، ﻣﺎداﻣﻴﻜـﻪ ﭘﺮوﺳـﺲ ﻣﺼـﺮف ﻛﻨﻨـﺪه داده را ﻣﺼـﺮف ﻧﻜـــﺮده.داده را ﻣﺼـﺮف ﻣﻲﻛﻨـﺪ
.ﺑﻌﺪي را ﺗﻮﻟﻴــﺪ ﻧﻤﻲﻛﻨـﺪ
always
begin
prodReady = 0; // Indicate nothing to transfer
forever
begin
// ... Prduce data and put into temp
// Wait for consumer ready
wait( consReady ) dataOut = $random;
endmodule
always
begin
consReady = 1; // Indicate nothing to transfer
forever
begin
wait( prodReady ) dataInCopy = dataIn;
// Indicate value consumed
consReady = 0;
// ... munch on data
// Complete handshake
wait( !prodReady ) consReady = 1;
end
end
endmodule
endmodule
Producer Writes
Consumer Reads
Ncontrol
Control Control
control control
supply1 Vdd;
supply0 Vss;
assign a = Vdd; // Connect a to Vdd
ﺧﻮدآﻣـﻮز زﺑـﺎن ﺗﻮﺻﻴـﻒ ﺳــﺨﺖاﻓﺰاري Verilog
ﺗﻬﻴﻪ ﻛﻨﻨﺪه :ﺳــﻌﻴﺪ ﺻﻔـﺮي
sbar endmodule
s