【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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...