2013-08-31 1 views
0

하나의 모듈에서 다른 모듈을 인스턴스화했습니다. 순서대로 실행하고 싶습니다. 모든 모듈을 활성화하고 확인하는 신호가 있습니다. 어떻게해야합니까?Verilog에서 인스턴스화 된 모듈을 차례로 활성화하는 방법

다음은 코드입니다 :

module memorycontroller(
    input [7:0] A, 
    input [7:0] B, 
    input [1:0] adrress, 
    input  clk, 
    output [7:0] A_mem, 
    output [7:0] B_mem 
); 
    reg   LMwrEnable, localmemEnable; 
    integer  LMwrack, localmemack; 
    reg [7:0] A1, B1; 

    initial 
    begin 
     LMwrEnable  = 1; 
     localmemEnable = 0; 
    end 

    memorywrite LMwr (
     .clk  (clk  ), 
     .A  (A   ), 
     .B  (B   ), 
     .adr  (adrress ), 
     .enable (LMwrEnable), 
     .ack  (LMwrack ) 
    ); 

    bram_tdp localmem (
     .a_clk (clk   ), 
     .a_wr (1'b0   ), 
     .a_addr (adrress  ), 
     .a_din (A1   ), 
     .a_dout (A_mem   ), 
     .b_clk (clk   ), 
     .b_wr (1'b0   ), 
     .b_addr (adrress+1'b1 ), 
     .b_din (B1   ), 
     .b_dout (B_mem   ), 
     .enable (localmemEnable), 
     .ack  (localmemack ) 
    ); 

    [email protected](posedge clk) 
    begin 
     if(LMwrack) 
     localmemEnable = 1; 
    end 


endmodule 

초기 진술에서 내가 초기 블록과 ACK 신호에만 LMwr 모듈을 사용하도록 설정 한 난 항상 차단에 localmem 모듈을 사용했지만이 나에게 잘못된 결과를주고있다. 다른 모듈을 순차적으로 실행하는 법을 가르쳐 주시겠습니까?

는 다음이 상기 코드를 메모리에 기록하는 memorywrite 모듈

module memorywrite(
    input clk, 
    input [7:0] A, 
    input [7:0] B, 
    input [1:0] adr, 
    input enable, 
    output ack 
    ); 
    wire [7:0] C,C1; 

bram_tdp localmem (
    .a_clk(clk), 
    .a_wr(1'b1), 
    .a_addr(adr), 
    .a_din(A), 
    .a_dout(C), 
    .b_clk(clk), 
    .b_wr(1'b1), 
    .b_addr(adr+1'b1), 
    .b_din(B), 
    .b_dout(C1), 
    .enable(enable), 
    .ack(ack) 
    ); 

endmodule 

이다.

module mmTesting; 

    // Inputs 
    reg [7:0] A; 
    reg [7:0] B; 
    reg [1:0] adrress; 
    reg clk; 

    // Outputs 
    wire [7:0] A_mem; 
    wire [7:0] B_mem; 

    // Instantiate the Unit Under Test (UUT) 
    memorycontroller uut (
     .A(A), 
     .B(B), 
     .adrress(adrress), 
     .clk(clk), 
     .A_mem(A_mem), 
     .B_mem(B_mem) 
    ); 

    initial begin 
     // Initialize Inputs 
     A = 0; 
     B = 0; 
     adrress = 0; 
     clk = 0; 

     // Wait 100 ns for global reset to finish 
     #100; 
     A = 5; 
     B = 5; 
     adrress = 0; 

     #100 A = 6; 
     B = 2; 
     adrress = 1; 


     // Add stimulus here 

    end 
    always #5 clk=!clk; 
endmodule 

결과는 것과 동일해야합니다 :

은 위에서 언급하고 여기에

module bram_tdp #(
    parameter DATA = 8, 
    parameter ADDR = 2 
) (
    input enable, 
    output ack, 
    // Port A 
    input wire    a_clk, 
    input wire    a_wr, 
    input wire [ADDR-1:0] a_addr, 
    input wire [DATA-1:0] a_din, 
    output reg  [DATA-1:0] a_dout, 

    // Port B 
    input wire    b_clk, 
    input wire    b_wr, 
    input wire [ADDR-1:0] b_addr, 
    input wire [DATA-1:0] b_din, 
    output reg  [DATA-1:0] b_dout 
); 

// Shared memory 
reg [DATA-1:0] mem [(2**ADDR)-1:0]; 

// Port A 
always @(posedge a_clk) begin 
if(enable) begin 
    a_dout  <= mem[a_addr]; 
    if(a_wr) begin 
     a_dout  <= a_din; 
     mem[a_addr] <= a_din; 
    end 
    end 
end 

// Port B 
always @(posedge b_clk) begin 
if(enable) begin 
    b_dout  <= mem[b_addr]; 
    if(b_wr) begin 
     b_dout  <= b_din; 
     mem[b_addr] <= b_din; 
    end 

    end 
end 
assign ack=1; 
endmodule 

위에 언급 한 첫 번째 코드로 읽어 두번째 코드에 의해 작성되는 실제 메모리 모듈입니다 다음은 테스트 벤치입니다 나는 기억에 쓰고있다.

+0

잘못된 결과가 무엇입니까? 원하는 결과는 무엇입니까? 테스트 벤치 코드는 어디에 있습니까? – toolic

답변

2

Verilog가 하드웨어 설명이고 인스턴스화되지 않은 모듈이 아닌 모듈이 아닌 인스턴스화가 모두 실행될 수 있고 병렬로 존재할 수 있다는 점을 명확히하기 위해 하나를 실행하는 C 등가와 달리.

인스턴스 A와 B가있는 경우 FSM (Finite State Machine)을 사용하면 A가 완료 신호를 받으면 A 활성화 B를 비활성화하고 B가 완료되고 반복 될 때까지 기다릴 수 있습니다.

NB : 주석 처리 된 코드가 질문과 관련이없는 경우 제거 할 수 있으므로 문제를 재현하는 데 필요한 최소 코드로 질문을 줄이는 것이 좋습니다.