1 - سطح گیت
جلسه اول (ماژول ها) جلسه دوم (گیت ها) جلسه سوم (نوع سیگنال) جلسه چهارم (پایان فصل)2 - مقداردهی مداوم
جلسه پنجم (اُپراتور ها) جلسه ششم (آرایه ها) جلسه هفتم (شرط ها) جلسه هشتم (فراخوانی ماژول) جلسه نهم (تست بنچ) جلسه دهم (نگاشت حافظه)3 - سطح رفتاری (ترکیبی)
جلسه یازدهم (بلاک Always) جلسه دوازدهم (ابزار ها) جلسه سیزدهم (نوع پردازش) جلسه چهاردهم (نکات تکمیلی) جلسه پانزدهم (پایان فصل)4 - سطح رفتاری (ترتیبی)
جلسه شانزدهم (لبه ها) جلسه هفدهم (تست بنچ 2) جلسه هجدهم (شمارنده ها) جلسه نوزدهم (ضرب و شیفت) جلسه بیستم (استیت ماشین) جلسه بیست و یکم (کشف رشته) جلسه بیست و دوم (فرکانس) جلسه بیست و سوم (نان بلاک) جلسه بیست و چهارم (پایان)5 - جلسات تمرینی
جلسه تمرین اول (تاخیر ها) جلسه تمرین دوم (الحاق-منطق) جلسه تمرین سوم (شیفت ها) جلسه تمرین چهارم (استیت)6 - مثال های پروژه محور
پروژه طراحی پردازنده RTL پروژه پردازنده Maano پروژه پردازنده MIPS7 - ارتباط و گفتگو
ارتباط با نویسنده گروه تلگرام تبلیغات و آگهیآموزش وریلاگ آموزش Verilog
در این جلسه به دو مبحث نان بلاکینگ و طراحی در سطح RTL میپردازیم . نان بلاکینگ فقط در جاهایی مطرح میشه که از بلاک always استفاده کردیم و حتما توی لیست حساسیت ، لبه یک سیگنال رو (مثل کلاک) نوشتیم . بنابراین در گیت ها یا assign ها و یا (*)@always ها خبری از نان بلاکینگ نیست . حالا قضیه نان بلاکینگ چیه ؟ توصیه شده در توصیف مدارات ترتیبی که با لبه یک کلاک یا لبه یک سیگنالی کار میکنند ، بجای = از => استفاده بشه . به کد زیر نگاه کنید ، این کد بلاکینگ نوشته شده :
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12- 13- 14- 15- 16- 17- 18- 19- 20-
module Example( input X, input Y, input K, input P, input Clk, output reg F, output reg G, output reg H ); always @(posedge Clk) begin F = X+Y; G = K-P; if (K==1) H = 2*P; end endmodule
اما به ما توصیه شده بود که نان بلاکینگ بنویسیم ، پس = هارو تبدیل به => میکنیم :
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12- 13- 14- 15- 16- 17- 18- 19- 20-
module Example( input X, input Y, input K, input P, input Clk, output reg F, output reg G, output reg H ); always @(posedge Clk) begin F <= X+Y; G <= K-P; if (K==1) H <= 2*P; end endmodule
خب حالا دوتا سوال پیش میاد ، اول اینکه چه فرقی کرد ؟ دوم اینکه چرا این توصیه به ما شده ؟ برای پاسخ به سوال اول به کد زیر نگاه کنید :
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12- 13- 14- 15- 16- 17- 18- 19-
module Example( input Clk, output reg [7:0] A, output reg [7:0] B ); initial begin A = 6; B = 8; end always @(posedge Clk) begin A = B; B = A; end endmodule
در خط 8 مقدار اولیه A رو 6 و مقدار اولیه B رو 8 قراردادیم . حالا وقتی برای اولین بار لبه کلاک بیاد A=B خواهد شد ، یعنی A=8 میشه پس دیگه A شیش نیست، سپس در خط بعدی B=A میشه یعنی چند ؟ (B=A=8) بنابراین A و B هر دو مقدار 8 رو خواهند داشت . به این میگن مقداردهی به صورت بلاکینگ که مقدار هر متغییر توی هر خط تعیین میشه . اما بریم سراغ مقداردهی نان بلاکینگ :
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12- 13- 14- 15- 16- 17- 18- 19-
module Example( input Clk, output reg [7:0] A, output reg [7:0] B ); initial begin A = 6; B = 8; end always @(posedge Clk) begin A <= B; B <= A; end endmodule
در خط 8 مقدار اولیه A و B شش و هشت شد . حالا وقتی برای اولین بار لبه کلاک بیاد ابتدا A<=B رو داریم ، آیا مقدار A هشت میشه ؟ خیر ، الان نمیشه ان شاالله بعدا خواهد شد ، بعدا یعنی کی ؟ یعنی وقتی تمام خطوط بلاک always انجام که شد . پس نان بلاکینگ یعنی مقدار هر سیگنال در هر خط مشخص میشه اما اون مقدار رو اون لحظه نمیگیره بلکه در آخر میگیره ، پس فعلا مقدار A همون مقدار قبلی خودش می مونه تا خطوط بعدی خونده بشه ، وقتی خطوط بعدی خونده شد در آخر مقدار A هشت خواهد شد . در خط بعدی داریم B<=A خب حالا B باید چه مقداری بشه ؟ مقدار A ، مقدار A چنده ؟ شش ، هنوز هشت نشده پس مقدار B ان شاالله شش خواهد شد . خب حالا همه خطوط این بلاک خونده شد ، مقدار A و B برابر با مقادیری میشه که گفتیم ان شالله خواهد شد ، یعنی A هشت و B شش میشه . در صورتی که توی ساختار بلاکینگ مقدار هر دو سیگنال هشت میشد . پس باید حواس مون رو جمع کنیم ، وقتی از => به جای = استفاده میکنیم ، ممکنه محاسبات مون تغییر کنه . پس سعی کنید وقتی نان بلاکینگ کدنویسی میکنید به این نکته توجه کنید که مقادیر سیگنال های سمت چپ ، به ترتیب داده نمیشه بلکه در آخر یکجا داده میشه . به مثال زیر دقت کنید :
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12- 13- 14- 15- 16- 17-
module Example( input Clk, output reg X ); reg [7:0] Counter; initial Counter = 0; always @(posedge Clk) begin Counter = Counter+1; if (Counter == 5) X = 1; end endmodule
بعد از اومدن پنج تا لبه کلاک ، مقدار کانتر ما 5 خواهد شد سپس شرط مذکور برقرار شده و سیگنال X=1 خواهد شد ، پس در این ساختار بلاکینگ مقدار سیگنال X بعد از 5 کلاک ، یک خواهد شد . اما در مثال زیر :
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12- 13- 14- 15- 16- 17-
module Example( input Clk, output reg X ); reg [7:0] Counter; initial Counter = 0; always @(posedge Clk) begin Counter <= Counter+1; if (Counter == 5) X <= 1; end endmodule
این ساختار نان بلاکینگ است ، بعد از اومدن پنج کلاک مقدار کانتر در کلاکه پنجم ، 5 نخواهد شد ، بلکه ان شالله 5 خواهد شد ، پس وقتی به شرط میرسیم هنوز مقدار کانتر 5 نشده و X=1 نمیشه ، وقتی که از شرط عبور میکنیم به انتهای بلاک رسیدیم حالا کانتر پنج میشه ، در کلاک ششم مقدار کانتر ان شاالله شش خواهد شد ، به شرط میرسیم مقدار کانتر چند هست ؟ 5 ، پس X=1 میشه ، پس در اینجا میبینیم بعد از طی شدن 6 کلاک ، مقدار X=1 شد . خب حالا برسیم به سوال دومی که ابتدای جلسه مطرح کردیم ، چرا به ما توصیه شده بلاک های ترتیبی رو بصورت نان بلاکینگ کدنویسی کنیم ؟ الف) در برخی جاها به مدارهایی برخورد میکنید که اصلا نمیشه رفتارشون رو بلاکینگ توصیف کرد و هرکاری میکنید نمیشه توصیفش کنید ، در اون لحظه خاصیت نان بلاکینگ مثل فرشته نجات برای شماست . ب) ما در وریلاگ قراره رفتار مدار هارو مدلسازی کنیم ، در دنیای واقعی مدارهای ترتیبی رفتار شون به صورت نان بلاکینگ هست ، بنابراین درسته که ما میتونیم خیلی از مدارات ترتیبی رو بلاکینگ توصیف کنیم و عملکردشون هم صحیح باشه ، اما کارمون با ذات و طبیعت مدارات همخوانی نداره و حرفه ای نیست . مبحث بعدی که قرار بود در این جلسه بهش بپردازیم ، بحث توصیف در سطح RTL هستش . ما می تونیم انواع مدارات رو در سطح گیت ، رفتاری و ... توصیف کنیم اما استاندارد ترین نوع توصیف ، توصیف RTL هست که مهم ترین ویژگی این توصیف اینه که معمولا مدار به دو بخش دیتاپس و کنترل یونیت تقسیم میشه . این بحث یک مسئله کاربردی و مهمه که در قالب نوشتار نمیشه توضیحش داد بنابراین سعی کنید مثال پروژه محور "طراحی پردازنده RTL" رو تهیه کنید تا با نحوه توصیف مدارات در سطح RTL آشنا بشید . این مبحث بسیار مهمه ، چون من توی یک پاراگراف توضیح دادم و یا اینکه آخرین مبحث دوره است دلیلی بر بی اهمیت بودن این قضیه نیست بلکه مشکل اینه توی نوشتار نمیشه این مبحث مهم رو منتقل کرد . برای تهیه این مثال پروژه محور میتونید از کد تخفیف Fer استفاده کنید . (F بزرگ) دانلود فیلم جلسه
رفتن به جلسه بعد ...
مهسا
دم شما گرم
سید محسن
چاکریم :D
یاسین عرفانی پور
یکی از بهترین دوره هایی بود که دیدم و کل دوره رو تهیه کردم، خیلی ممنون آقای باقری عزیز.
سید محسن
امیدوارم در ادامه مسیر درسی تون موفق باشید