از معاملات برگشت در درایور UVM پشتیبانی کنید

ساخت وبلاگ

من یک درایور ساده دارم که رابط کاربری با 1 چرخه معتبر و داده را اداره می کند. پس از پایان معامله معتبر باید از بین برود.

مجازیTaskMain_Phase(مرحله UVM_Phase); فوق العاده. main_phase(فاز); برای همیشه شروعseq_item_port. get_next_item(رفیق);drive_data(مجدداً);seq_item_port. item_done(); پایان دست پا :فاز اصلی// -------------------------------------- مجازی حفاظت شده وظیفهdrive_data(مورد curr_item); // شروع معامله @(خجالتvif. clk);vif. Valid 1;VIFداده ها curr_item.داده ها; // اتوبوس را آزاد کنید @ (خجالتvif. clk);vif. Valid 0;VIFداده ها $ تصادفی(); دست پا:drive_data

راننده هر معامله را با 2 چرخه ساعت انجام می دهد: 1 چرخه چرخه و چرخه دوم برای انتشار.

اکنون من می خواهم با پهنای باند کامل کار کنم ، منظورم این است که معتبر نباید بین معاملات از بین برود

من این رو چطور میتونم انجام بدم ؟

پاسخ

شانتی دسترسی کامل 88 پست

در پاسخ به al_verif: شما می توانید با ارائه محدودیت ها ، آن را از دنباله کنترل کنید و می توانید راننده را به عنوان قابل استفاده مجدد کنید

//توالی وظیفهبدنه()رفیق=قسمت::type_id::ايجاد كردن("req"); // توسط Cange محدوده حلقه شما می توانید داده های شماره را کنترل کنید که به طور مداوم رانده شوند تکرار(10) شروعstart_item(رفیق); ادعا کردن(reqتصادفی کردن() بامعتبر== 1;>);تا پایان_یتم(رفیق); پایان // پس از رانندگی داده ها به عنوان 0 معتبر استstart_item(رفیق); ادعا کردن(reqتصادفی کردن() بامعتبر== 0;>);تا پایان_یتم(رفیق); دست پا // اکنون در درایور نیازی به انجام هیچ تغییری نیست مجازی وظیفهفاز اصلی(مرحله UVM_Phase); فوق العاده. main_phase(فاز); برای همیشه شروعseq_item_port. get_next_item(رفیق);drive_data(مجدداً);seq_item_port. item_done(); پایان دست پا :فاز اصلی// -------------------------------------- مجازی حفاظت شده وظیفهdrive_data(مورد curr_item); // شروع معامله @(خجالتvif. clk);vif. Valid 1;VIFداده ها curr_item.داده ها; دست پا:drive_data

chr_sue دسترسی کامل 3857 پست

معتبر یک سیگنال Controö است که هرگز نباید آن را به معامله SEQ_ITEM/معامله وارد کنید. اما شما می توانید 2 حالت عملیاتی مختلف داشته باشید ، یکی برای Standars و دیگری برای عرض باند کامل.

al_verif دسترسی کامل 16 پست

2 حالت مختلف از چه؟2 حالت در درایور و در قسمت اضافی SEQ_ITEM برای رسیدگی به آن اضافه کنید؟

ما نمی توانیم آن را در راننده حل کنیم؟

al_verif دسترسی کامل 16 پست

من سعی کردم از آن در راننده پشتیبانی کنم و این کار می کند ، اما فکر می کنم نحوه انجام این کار کمی خطرناک است:

بیتNew_Req; مجازیTaskMain_Phase(مرحله UVM_Phase); فوق العاده. main_phase(فاز); برای همیشه شروعseq_item_port. get_next_item(رفیق);New_Req= 1;drive_data(مجدداً);New_Req= 0;seq_item_port. item_done(); پایان دست پا :فاز اصلی// -------------------------------------- مجازی حفاظت شده وظیفهdrive_data(مورد curr_item); // شروع معامله @(خجالتvif. clk);vif. Valid 1;VIFداده ها curr_item.داده ها; چنگال شروع // اتوبوس را آزاد کنید #0; // آخرین بار در کیک شبیه سازی انجام شود if (New_Req== 0 ) شروع @ (خجالتvif. clk);vif. Valid 0;VIFداده ها $ تصادفی(); پایان پایان join_none دست پا:drive_data

من یک سیگنال جدید new_req اضافه کردم که به عنوان پرچم استفاده می شود تا نشان دهد که آیا New Req ادعا می کند وقتی مورد فعلی هنوز اتوبوس را آزاد نکرده است.

من از مطرح کردن مشکلات مربوط به این سیگنال نگران هستم.

شانتی دسترسی کامل 88 پست

در پاسخ به al_verif: اگر نمی خواهید سیگنال کنترل را در مورد دنباله در نظر بگیرید ، می توانید این کار را انجام دهید. در کلاس معامله ، داده ها را به عنوان یک آرایه پویا و محدودیت اندازه آرایه از دنباله اعلام کنید.

//توالی وظیفهبدنه()رفیق=قسمت::type_id::ايجاد كردن("req"); // برای انتقال تک شروعstart_item(رفیق); ادعا کردن(reqتصادفی کردن() با داده ها.اندازه == 1;>);تا پایان_یتم(رفیق); پایان // برای چندین انتقال. ، عرض باند کاملstart_item(رفیق); ادعا کردن(reqتصادفی کردن() باداده ها.اندازه == 10/*یا هر مقدار دیگر برای نیاز شما*//;>);تا پایان_یتم(رفیق); دست پا // اکنون در درایور نیازی به انجام هیچ تغییری نیست مجازی وظیفهفاز اصلی(مرحله UVM_Phase); فوق العاده. main_phase(فاز); برای همیشه شروعseq_item_port. get_next_item(رفیق);drive_data(مجدداً);seq_item_port. item_done(); پایان دست پا :فاز اصلی// -------------------------------------- مجازی حفاظت شده وظیفهdrive_data(مورد curr_item); // شروع معامله برای هر(curr_item.داده ها[i]) شروع @(خجالتvif. clk);vif. Valid 1;VIFداده ها curr_item.داده ها[i]; پایان // اتوبوس را آزاد کنید @ (خجالتvif. clk);vif. Valid 0;VIFداده ها $ تصادفی(); دست پا:drive_data

al_verif دسترسی کامل 16 پست

متشکرم. راه حل شما خوب است.

اما مسئله این است که من فقط در مورد خود "داده" ندارم ، زمینه هایی دارم. و فکر نمی کنم ایده خوبی برای رسیدگی به برخی از صف ها یا صف ساختار باشد.

من معتقدم که یک راه حل ساده در راننده وجود دارد. ما فقط باید آن را پیدا کنیم.

yasaswi93 دسترسی کامل 22 پست

من مشکل مشابه رو دارم. آیا توانستید این مشکل را برطرف کنید؟

chr_sue دسترسی کامل 3857 پست

آیا می توانید نشان دهید که seq_item شما چگونه به نظر می رسد؟

yasaswi93 دسترسی کامل 22 پست

بدن دنباله من به این شکل است: // دنباله بدن

وظیفهsome_seq::بدنه(); // مورد را شروع کنیدstart_item(مورد_ه); // مورد پایانتا پایان_یتم(مورد_ه); // پاسخ پاسخget_response(مورد_ه); دست پا

راننده من به این شکل است:

وظیفهDRV::run_phase(مرحله UVM_Phase); @(m_vif. drv_cbدر صورت (m_vif. rst_n=== 0)); // تنظیم مجدد سیگنال هاrestet_signals(); @(m_vif. drv_cbدر صورت (m_vif. rst_n=== 1)); // شروع به رانندگیget_and_drive(); دست پا :run_phaseوظیفهDRV::get_and_drive(); رونداصلی_; رونداول; برای همیشه شروع // هنگام تنظیم مجدد رانندگی نکنید در حالی که(m_vif. rst_n!== 1) @(m_vif. drv_cbدر صورت (m_vif. rst_n=== 1)); // مورد بعدی را از ترتیب سنج دریافت کنیدseq_item_port. get_next_item(رفیق); if(!$ بازیگران(RSP,req. Clone())) شروع`uvm_fatal(get_type_name(), "Run_phase :: RSP RSP) پایانrsp. set_id_info(رفیق); // معامله فعلی را رانندگی کنید چنگال // معامله را رانندگی کنید شروعاصلی_=روند::خود();Drive_item(RSP); if(اول)RST_MON_THREAD.کشتن(); پایان // نظارت بر سیگنال تنظیم مجدد شروعاول=روند::خود(); @(ناگفتهm_vif. rst_n) شروع if(اصلی_)main_thread.کشتن(); // تنظیم مجددrestet_signals(); پایان پایان پیوستن به_ // ارسال مورد_دون و پاسخ به ترتیب سنجseq_item_port. item_done();seq_item_port. put_response(RSP); پایان // برای همیشه دست پا :get_and_driveوظیفهDRV::Drive_item(مرجعمورد_ت مورد_ه); // RANE REQ if(item_h. m_trans_type==نوع اول_) شروع خودکار در نظر گرفتنتاخیر_ سیکل=$ urandom_range(m_cfg_h. min_dly,m_cfg_h. max_dly); تکرار (تاخیر_ سیکل) @(m_vif. drv_cb); if(some_condition) شروعm_vif. drv_cb. one_valid 1;m_vif. drv_cb. one_hdrمورد_ ه. م_ هیدر; پایان دیگر شروع خودکارitem_t auto_item_h=مورد_ه;check_one_credits_and_drive(auto_item_h); // کار وقت گیر پایان @(m_vif. drv_cb);m_vif. drv_cb. one_valid 0; پایان دیگر if(item_h. m_trans_type==نوع دوم) شروع خودکار در نظر گرفتنتاخیر_ سیکل=$ urandom_range(m_cfg_h. min_dly,m_cfg_h. max_dly); تکرار (تاخیر_ سیکل) if(some_condition) شروعm_vif. drv_cb. second_valid 1;m_vif. drv_cb. second_hdrمورد_ ه. م_ هیدر;m_vif. drv_cb. second_dataitem_h. m_data; پایان دیگر شروع خودکارitem_t auto_item_h=مورد_ه;check_two_credits_and_drive(auto_item_h); // کار وقت گیر پایان @(m_vif. drv_cb);m_vif. drv_cb. second_valid 0; پایان دست پا :Drive_item
پلتفرم های تجاری...
ما را در سایت پلتفرم های تجاری دنبال می کنید

برچسب : نویسنده : مریم کاویانی بازدید : 27 تاريخ : سه شنبه 24 مرداد 1402 ساعت: 11:57