2011-04-19 125 views
1

我的代碼爲設計模塊和測試臺編譯,但是當我模擬我沒有得到正確的輸出。任何人都可以告訴我我的代碼中哪裏出錯了嗎?verilog模擬錯誤

下面是測試平臺的代碼:

module testbench; 
reg [511:0]FROM_LS; 
reg CLK; 
reg [63:0]TO_IF_ID; 

initial 
begin 
    CLK= 0; 
    TO_IF_ID[63:0]=63'b0; 
    FROM_LS[511:480]= 32'b00011_00000_00100_01100_11100_10111_01; 
    FROM_LS[479:448]=32'b00_11000_00100_01111_11111_00011_10000; 
end 
always 
begin 
    #10 CLK= ~ CLK; 
    //FROM_LS[511:448]= ~ FROM_LS[511:448]; 
    $display("FROM_LS= %b", FROM_LS); 
    $display("TO_IF_ID= %b", TO_IF_ID); 
end 
endmodule 

,這裏是爲設計的代碼塊:我期待的是TO_IF_ID的值應該是0001100000001000110011100101110100110000010001111111110001110000但我

module inst_line_buffer(input wire [511:0]from_LS, 
        input wire clk, 
        output reg [63:0]to_if_id); 
parameter mem_size=16; 
integer k;  
reg [31:0] ilb[0:mem_size-1]; 

initial 
begin 
    for (k = 0; k < mem_size ; k = k + 1) 
    begin 
    ilb[k] = 32'b00; 
    //$display ("ilb= %b",ilb[k]); 
    end 
end 
always @(posedge clk) 
    begin 
    ilb[0]= from_LS[511:480]; 
    ilb[1]= from_LS[479:448]; 
    ilb[2]= from_LS[447:416]; 
    ilb[3]= from_LS[415:384]; 
    ilb[4]= from_LS[383:352]; 
    ilb[5]= from_LS[351:320]; 
    ilb[6]= from_LS[319:288]; 
    ilb[7]= from_LS[287:256]; 
    ilb[8]= from_LS[255:224]; 
    ilb[9]= from_LS[223:192]; 
    ilb[10]= from_LS[191:160]; 
    ilb[11]= from_LS[159:128]; 
    ilb[12]= from_LS[127:96]; 
    ilb[13]= from_LS[95:64]; 
    ilb[14]= from_LS[63:32]; 
    ilb[15]= from_LS[31:00]; 
    to_if_id [63:32]= ilb[0]; 
    to_if_id [31:0]= ilb[1]; 
    $display("ilb= %b", ilb[1]); 
    end 
endmodule 

;得到全零。誰能幫我嗎?

+1

在您提供的代碼中,inst_line_buffer沒有實例化。 – Andy 2011-04-19 18:40:56

+0

@andy:我在上面的代碼中實例化了inst_line_buffer,如下所示: inst_line_buffer ilb(FROM_LS,CLK,TO_IF_ID); 現在我無法模擬。我得到的錯誤爲: **錯誤:(vsim-3053)C:/Modeltech_pe_edu_10.0a/examples/tstbnch.v(5):非法輸出或輸入端口連接「port」to_if_id'「。 #Region:/ testbench/ilb #加載設計時出錯 – kinirashmi 2011-04-19 19:50:17

+0

實例化,因爲我已在我的答案中完成並注意我對reg/wire的評論。 – toolic 2011-04-19 19:54:10

回答

1

當您在testbench模塊上運行模擬時,TO_IF_ID始終爲0,因爲您只在initial塊中的時間0處爲其分配了一次值。如果你想要改變價值,它需要以某種方式驅動。

正如Andy在評論中指出的那樣,您可能打算在您的測試平臺中實例化inst_line_buffer模塊。 Verilog不會爲你神奇地做到這一點。但是,您應該將TO_IF_ID聲明爲wire而不是reg,並將其從initial塊中刪除。

module testbench; 
reg [511:0]FROM_LS; 
reg CLK; 
wire [63:0]TO_IF_ID; 

inst_line_buffer inst_line_buffer (
    .from_LS (FROM_LS), 
    .clk  (CLK), 
    .to_if_id (TO_IF_ID) 
); 

initial begin 
    CLK= 0; 
    FROM_LS[511:480]= 32'b00011_00000_00100_01100_11100_10111_01; 
    FROM_LS[479:448]=32'b00_11000_00100_01111_11111_00011_10000; 
    #500 $finish; 
end 
always 
begin 
    #10 CLK= ~ CLK; 
    //FROM_LS[511:448]= ~ FROM_LS[511:448]; 
    $display("FROM_LS= %b", FROM_LS); 
    $display("TO_IF_ID= %b", TO_IF_ID); 
end 
endmodule 
+1

感謝您的幫助。 – kinirashmi 2011-04-19 23:54:21