2017-04-23 72 views
0

我想在一個模塊中分割一個verilog程序,該模塊將從頂部調用。 這是一個顯示輸出和每一位的計數器。Verilog model sim

module file1(output reg b3, 
output reg b2, 
    output reg b1, 
output reg b0, 
output reg[3:0]y); 

reg clock; 
initial begin 
    clock=0; 
    b0=0; 
    b1=0; 
    b2=0; 
    b3=0; 
    y=0; 
    forever #5 clock= ~clock; 
end 
always @(posedge clock) 
    begin 
    y=y+1; 
    b0=y[0]; 
    b1=y[1]; 
    b2=y[2]; 
    b3=y[3]; 
    end 
endmodule 

這就是我如何將程序拆分到top調用的模塊中。 MODULE

module modul(input reg clock, 
output reg b3, 
output reg b2, 
output reg b1, 
output reg b0, 
output reg[3:0]y 
); 
always @(posedge clock) 
    begin 
    y=y+1; 
    b0=y[0]; 
    b1=y[1]; 
    b2=y[2]; 
    b3=y[3]; 
    end 
endmodule 

TOP

`timescale 1ns/1ps 
    module testare_modul; 
    reg clock; wire clock1; 
    reg b3; 
    reg b2; 
    reg b1; 
    reg b0; 
    reg [3:0]y; 
    modul lol(
    .clock(clock), 
    .y(y), 
    .b3(b3), 
    .b2(b2), 
    .b1(b1), 
    .b0(b0) 
    ); 
    initial begin 
     clock=0; 
     b0=0; 
     b1=0; 
     b2=0; 
     b3=0; 
     y=0; 
     forever #5 clock= ~clock; 
    end 
    endmodule 

我有0個錯誤compilling的時候,但是當我試圖模仿我得到非法輸出或INOUT端口connection.I是新來的這些語言,我會感激你的幫助很多!

回答

0

當然這個output reg[3:0]y應該是這個input reg[3:0]y

0

這裏有幾件事。 在模塊中,您已將時鐘定義爲輸入寄存器。輸入不能註冊。他們只是輸入。所以,CLK已經被定義爲

input clock, 

其次,您已經定義Ÿ爲輸出REG,但它也是一個輸入,因爲你是從頂部模塊驅動y的值。如果你確實需要這個功能,那麼y需要被定義爲inout。但是,如果它被聲明爲inout,那麼它不能被始終驅動,您需要一些其他信號來控制何時該端口是輸入並由模塊內的驅動程序進行三態處理,以及何時模塊驅動該端口,即,輸出,所以它必須在頂層模塊的驅動程序中處於三態。

如果你解釋你在這個設計中試圖達到什麼樣的功能,讓社區能夠提供幫助,那會更好。

請注意,在verilog中,模塊中的reg和端口模塊與在'C'中傳遞的函數參數有很大的區別