日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Verilog】数据流建模传输问题:赋值传输有方向

發布時間:2023/11/30 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Verilog】数据流建模传输问题:赋值传输有方向 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這次,我們說明的是,assign語句實現的數據流建模,包含的是兩個層面

  • 建立聯系
  • 傳輸方向
  • assign A = B的本質含義是

  • A與B建立關聯
  • B的值傳給A
  • 這個傳輸方向至關重要,實際情況是什么,就必須按照順序進行,不是單純地連線,本質是數據的傳輸,是有方向的。

    看看下面的CPU的例子,注意注釋中的【關注點】

    // reg_files_1 Inputs wire [31:0] ALUresult; // 【關注點1】wire [4:0] rA = instruction[25:21]; wire [4:0] rB = instruction[20:16]; wire [4:0] rW = instruction[15:11]; wire [31:0] writeData = ALUresult; // 【關注點2】 wire RegWrite;// reg_files_1 Outputs wire [31:0] A; wire [31:0] B;reg_files_1 u_reg_files_1 (.clk ( clk ),.rst_n ( rst_n ),.rA ( rA ),.rB ( rB ),.rW ( rW ),.writeData ( writeData ),.RegWrite ( RegWrite ),.A ( A ),.B ( B ));/******** ALU ********/// ALU_1 Inputs wire [3:0] ALUop;// ALU_1 Outputs // wire [31:0] ALUresult = writeData; // 【關注點3】ALU_1 u_ALU_1 (.A ( A ),.B ( B ),.ALUop ( ALUop ),.ALUresult ( ALUresult ));

    上面的例子是正確的,RTL優化的結果是
    我們看看錯誤的示例

    // reg_files_1 Inputs // wire [31:0] ALUresult; // 【關注點1】wire [4:0] rA = instruction[25:21]; wire [4:0] rB = instruction[20:16]; wire [4:0] rW = instruction[15:11]; wire [31:0] writeData; // = ALUresult; // 【關注點2】 wire RegWrite;// reg_files_1 Outputs wire [31:0] A; wire [31:0] B;reg_files_1 u_reg_files_1 (.clk ( clk ),.rst_n ( rst_n ),.rA ( rA ),.rB ( rB ),.rW ( rW ),.writeData ( writeData ),.RegWrite ( RegWrite ),.A ( A ),.B ( B ));/******** ALU ********/// ALU_1 Inputs wire [3:0] ALUop;// ALU_1 Outputs wire [31:0] ALUresult = writeData; // 【關注點3】ALU_1 u_ALU_1 (.A ( A ),.B ( B ),.ALUop ( ALUop ),.ALUresult ( ALUresult ));

    只是修改了關注點的部分,然而是錯誤的,但是,RTL優化結果看起來一樣,行為仿真的時候writeData確實Z 高阻抗狀態。

    高阻抗是為什么?

    通常就是不同的信號撞一起了


    對于同一個線路,同時輸入0和1就產生了高阻抗

    我們看看之前的示例是為什么。

    我們關注下面的部分

    在正確的示例中,使用的是

    wire [31:0] ALUresult; wire [31:0] writeData = ALUresult;

    也就是這樣的,這是符合CPU的運算邏輯的,將ALU結果輸出到寄存器寫入。
    錯誤的示例是

    wire [31:0] writeData; wire [31:0] ALUresult = writeData;

    這個時候,我們設置的是紅色箭頭的方向,而實際上,CPU運算會輸出橘色箭頭的數據,兩個不同的輸出撞一起導致了Z高阻抗狀態!

    小結

    賦值語句是有方向的!代表了邏輯設計方向,代表了數據傳輸方向,不能錯!

    一般都是右值賦給左值,同時,說明了傳輸方向是B到A

    補充

    如果兩個信號的聲明和賦值順序是反著的,可以聲明的時候不賦值,之后使用assign語句就好了。

    wire A; wire B; assign A = B;

    等價于

    wire B; wire A = B;

    總結

    以上是生活随笔為你收集整理的【Verilog】数据流建模传输问题:赋值传输有方向的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。