Verilog 中 inout 端口的使用与测试
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Verilog 中 inout 端口的使用与测试
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                inout 端口的使用
第一次遇到inout端口的使用,是在大三的時候,課程要求寫一個通過 I2C 讀取EEPROM的電路。當時連抄帶蒙實現了功能,助教略略檢查了一下就過關了。現在導師給了個小任務,給一個存儲芯片寫SPI接口,這又涉及到inout端口的使用了。不必奇怪,SPI的Master的確不需要用inout,但現在做的事寫SPI的Slave,目標存儲器用了inout。
稍稍百度一下可以知道,inout需要一個三態門,一個實現方法是(當然還有其它方法):
assign data_io=read?mem_tmp:8'bzzzzzzzz;
讀取時,往mem_tmp送數據,接收輸入時,直接從inout端口取數據,類似于:
mem_tmp <= memory[addr];
這是被讀取端。
如何進行測試
也許是我沒認真看其它網友的博客,我根據自己的理解理了理對inout端口的Testbench的編寫。
首先,Testbench沒有端口,也就沒有inout類型的信號/變量可以用,讀取數據需要wire類型的信號,寫入數據需要reg類型的信號,也就是說需要兩個信號來測試inout端口。
舉個例子,一個16-Byte隨機存取存儲器:
`timescale 1ns/1ps
module ram_16x8bit(
    input clk,
    input [7:0] addr,
    input read,
    inout [7:0] data_io
);
reg [7:0] memory[0:15];
reg [7:0] mem_tmp;
assign data_io=read?mem_tmp:8'bzzzzzzzz;
initial begin
    $readmemh("mem.txt", memory);
end
always@(posedge clk) begin
    if(read) mem_tmp <= memory[addr];
    else memory[addr] <= data_io;
end
endmodule // 16Byte ram
它的Testbench可以是:
`timescale 1ns/1ps
module test;
reg clk;
reg [7:0] addr;
reg read;
wire [7:0] data_wire;
reg [7:0] data_reg;
assign data_wire = read?8'hzz:data_reg;
initial begin
    $dumpfile("wave.vcd");
    $dumpvars(0,test);
    clk = 1'b1;
    forever begin
        #5 clk = ~clk;
    end 
end
integer i;
initial begin
    // Read Test
    #10;
    i = 0;
    while(i<=15) begin
        #10;
        read = 1'b1;
        addr = i;
        i = i + 1;
    end
    //Write Test
    i = 0;
    while(i<=15) begin
        #10;
        read = 1'b0;
        addr = i;
        data_reg = 15 - i;
        i = i + 1;
    end
    i = 0;
    while(i<=15) begin
        #10;
        read = 1'b1;
        addr = i;
        i = i + 1;
    end
    #10 $finish;
end
ram_16x8bit test_ram(
    .clk(clk),
    .addr(addr),
    .read(read),
    .data_io(data_wire)
);
endmodule
對inout端口的處理:
assign data_wire = read?8'hzz:data_reg;
示意圖如下:
VCS生成的Schematic:
測試波形:
結論
本文實現了對inout端口的讀寫。
總結
以上是生活随笔為你收集整理的Verilog 中 inout 端口的使用与测试的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 最全解析:大数据和机器学习有什么区别
- 下一篇: objdump 从 ELF 文件 反汇编
