【HDLBits刷題筆記】17 Verification: Wrting Testbenches&CS450

来源:https://www.cnblogs.com/magnolia666/archive/2022/11/08/16870246.html
-Advertisement-
Play Games

Tb/clock 這題要求給dut模塊一個時鐘。 module top_module ( ); reg clk; always #5 clk=~clk; initial begin clk = 0; end dut u0(clk); endmodule Tb/tb1 產生指定的波形,使用延時語句給信 ...


Tb/clock

這題要求給dut模塊一個時鐘。

module top_module ( );
reg clk;
    always #5 clk=~clk;
    initial begin
        clk = 0;
    end
    dut u0(clk);
    
endmodule

Tb/tb1

產生指定的波形,使用延時語句給信號賦值即可。

module top_module ( output reg A, output reg B );//

    // generate input patterns here
    initial begin
        A=0;
        B=0;
        #10 A=1;
        #5 B=1;
        #5 A=0;
        #20 B=0;
    end

endmodule

Tb/and

題目要求對一個與門進行測試,要求產生波形圖中的激勵向量。

module top_module();
    reg [1:0]in;
    wire out;
    
    initial begin
        in = 2'b00;
        #10 in = 2'b01;
        #10 in = 2'b10;
        #10 in = 2'b11;
    end
    
    andgate u_and(in,out);
endmodule

Tb/tb2

同樣是寫一個testbench,但是比上面略複雜一點。

module top_module();
    reg clk;
    reg in;
    reg [2:0]s;
    wire out;
    
    initial begin
           clk=0;
        in=0;
        s=2;
        #10 s=6;
        #10 in=1;s=2;
        #10 in=0;s=7;
        #10 in=1;s=0;
        #30 in=0;
    end
    
    always #5 clk=~clk;
    
    q7 u_q7(clk,in,s,out);
endmodule

Tb/tff

要求驗證一個T觸發器,T觸發器在輸入t為1時輸出不斷地發展。

module top_module ();
    reg clk;
    reg reset;
    reg t;
    wire q;
    
    always #5 clk=~clk;
    initial begin
        clk=0;
        reset=1;
        t=0;
        #10 reset=0;t=1;
    end
    
    tff u_t(clk,reset,t,q);
endmodule

Cs450/timer

load信號為1載入data,load為0電路為一個倒數器,當倒計數為0時tc為1。

module top_module(
    input clk, 
    input load, 
    input [9:0] data, 
    output tc
);
    reg [9:0]counter;
    always@(posedge clk)
    begin
        if(load)
            counter <= data;
        else 
            counter <= (counter!=0)?(counter - 1'b1):0;
    end
    assign tc=(counter==0);

endmodule

Cs450/counter 2bc

這道題要求實現一個分支預測器,沒學過電腦體繫結構,百度了一下,分支預測器在分支指令執行結束之前猜測哪一路分支將會被運行,以提高處理器的指令流水線的性能。使用分支預測器的目的,在於改善指令管線化的流程。現代使用指令管線化處理器的性能能夠提高,分支預測器對於現今的指令流水線微處理器獲得高性能是非常關鍵的技術。

這裡其實也不用對分支預測器特別瞭解,能按照狀態轉換圖寫出代碼就行了。

懶得寫兩個always了,直接一個always給實現了。

module top_module(
    input clk,
    input areset,
    input train_valid,
    input train_taken,
    output reg[1:0] state
);
    parameter SNT=0,WNT=1,WT=2,ST=3;
    
    always@(posedge clk or posedge areset)
    begin
        if(areset)
            state <= WNT;
        else if(train_valid)begin
            case(state)
                SNT:state <= train_taken?WNT:SNT;
                WNT:state <= train_taken?WT:SNT;
                WT:state <= train_taken?ST:WNT;
                ST:state <= train_taken?ST:WT;
            endcase
        end
    end
    

endmodule

Cs450/history shift

題目很長,看了半天也不是特別懂,要寫代碼的話其實直接看description就行了。

predict_valid = 1,移入predict_taken到predict_history,當train_mispredicted = 1則移入train_taken到train_history,註意misprediction優先順序更高,所以放在上面的else if中。

module top_module(
    input clk,
    input areset,

    input predict_valid,
    input predict_taken,
    output reg[31:0] predict_history,

    input train_mispredicted,
    input train_taken,
    input [31:0] train_history
);
    
    always@(posedge clk or posedge areset)
    begin
        if(areset)
            predict_history <= 32'd0;
        else if(train_mispredicted)begin
            predict_history <= {train_history[30:0],train_taken};
        end
        else if(predict_valid)begin
            predict_history <= {predict_history[30:0],predict_taken};
        end
    end

endmodule

Cs450/gshare

這題是真的徹底看不懂了,抄了網上大佬的答案。鏈接:http://blog.74ls74.org/2022/03/17/20220317_HDLbits_uwaterloo_cs450/

module top_module(
    input clk,
    input areset,

    input  predict_valid,
    input  [6:0] predict_pc,
    output predict_taken,
    output reg [6:0] predict_history,

    input train_valid,
    input train_taken,
    input train_mispredicted,
    input [6:0] train_history,
    input [6:0] train_pc
);
    
    reg [1:0] PHT[127:0];
    integer i;
    always @(posedge clk, posedge areset) begin
        if (areset) begin
            predict_history <= 0;
            for (i=0; i<128; i=i+1) PHT[i] <= 2'b01;
        end
        else begin
            if (train_valid && train_mispredicted)
                   predict_history <= {train_history[6:0], train_taken};
            else if (predict_valid)
                predict_history <= {predict_history[6:0], predict_taken};
            
            if (train_valid) begin
                if (train_taken)
                    PHT[train_history ^ train_pc] <= (PHT[train_history ^ train_pc] == 2'b11) ? 2'b11 : (PHT[train_history ^ train_pc] + 1);
        else
                    PHT[train_history ^ train_pc] <= (PHT[train_history ^ train_pc] == 2'b00) ? 2'b00 : (PHT[train_history ^ train_pc] - 1);
            end
        end
    end
    assign predict_taken = PHT[predict_history ^ predict_pc][1];
endmodule

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、列表 無序列表和定義列表在網頁製作中應用非常廣泛 什麼是列表: 列表就是信息資源的一種展示形式。它可以使信息結構化和條理化,並以列表的樣式顯示出來,以便瀏覽者能更快捷地獲得相應的信息。 無序列表 <!--ul 聲明無序列表--> <ul> <!--li 聲明列表項--> <li>語文</li> ...
  • 面向對象之魔法方法 一、魔法方法的概念 ​ 定義在類中的雙下方法都可以稱為魔法方法 ​ 不需要人為調用,在特定的條件下會自動觸發,並運行 ​ 類似於__ init__, 當我在使用類產生對象時,會自動觸發 class Foo: # 雙下init就是魔法方法的一種 def __init__(self, ...
  • 職責鏈模式是一種與策略模式類似的設計模式,都是使用多個對象去處理同一個請求。不同的是,職責鏈模式針對的一條鏈路上的所有對象,而不是“非此即彼”的關係。 ...
  • 派生方法實戰 ​ 以上我們學習了通過super()的方法可以重寫父類、額外添加父類中的數據,下麵將通過實戰案例來講述super()方法來重寫、添加父類中的功能代碼 需求: 1、使用json格式,序列化字典d d = { 't1': datetime.date.today(), 't2': datet ...
  • 簡介: 代理模式,是結構型的設計模式。用於為其它對象提供一種代理以控制對這個對象的訪問。 目標對象可以是遠程的對象、創建開銷大的對象或需要安全控制的對象,並且可以在不改變目標對象的情況下添加一些額外的功能。 適用場景: 調用端不想或不能直接調用的對象。 服務端不想讓調用端看到核心實現。 優點: 服務 ...
  • 前言 大家早好、午好、晚好吖~ 最近,又爆出了許多例,身在長沙得我前段時間不是在做核酸就是在做核酸得路上 雖然現在還是隔一天一捅(小聲嗶嗶:我真的遭不住)希望疫情早日過去 疫情尚未結束,我們需要做好自己,時刻防範,不給別人添麻煩。 今天我們來嘗試用Python抓取世界疫情,實現可視化地圖展示。 採集 ...
  • Servlet03 11.練習 快捷鍵-可以快速地在訪問的文件件切換 ctrl+alt+向左箭頭:回到上次訪問的位置 ctrl+alt+向右箭頭:回到下一步訪問的位置 11.1CatServlet 首先創建項目servlet,配置好Tomcat,添加web應用支持。在web目錄下麵的WEB-INF目 ...
  • 1.實現攔截器 1.寫一個攔截器 繼承HandlerInterceptor preHandle: 調用時間: Controller方法處理之前【也就是路徑跳轉之前】; 執行順序: 鏈式Intercepter情況下,Intercepter按照聲明的順序一個接一個執行; 返回值: 返回值為true,則繼 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...