2013-12-25 2 views
-1
module multiplier(prod, busy, mc, mp, clk, start);  
    output [15:0] prod; 
    output busy; 
    input [7:0] mc, mp; 
    input clk, start; 

    reg [7:0] A, Q, M; 
    reg Q_1; 
    reg [3:0] count; 
    wire [7:0] sum, difference; 

    always @(posedge clk) 
    begin 
    if (start) begin 
     A <= 8'b0; 
     M <= mc; 
     Q <= mp; 
     Q_1 <= 1'b0; 
     count <= 4'b0; 
    end 
    else 
    begin 
     case ({Q[0], Q_1}) 
     2'b0_1 : {A, Q, Q_1} <= {sum[7], sum, Q}; 
     2'b1_0 : {A, Q, Q_1} <= {difference[7], difference, Q}; 
     default: {A, Q, Q_1} <= {A[7], A, Q}; 
     endcase 
     count <= count + 1'b1; 
    end 
    end 

    alu adder (sum, A, M, 1'b0); 
    alu subtracter (difference, A, ~M, 1'b1); 

    assign prod = {A, Q}; 
    assign busy = (count < 8); 

    initial 
    begin 
    $monitor($time,"prod=%b, busy==%b, mc=%b, mp=%b, clk=%b, start=%b", 
         prod, busy, mc, mp, clk, start); 
    end 
endmodule 

module alu(out, a, b, cin); 
    output [7:0] out; 
    input [7:0] a; 
    input [7:0] b; 
    input cin; 

    assign out = a + b + cin; 
endmodule 

---------------------------------- testbench ----- -----------------------------------------мой выход постоянно изменяется

module multi_tst_tst; 
    reg clk, start; 
    reg [7:0] a, b; 
    wire [15:0] ab; 
    wire busy; 

    multiplier multiplier1 (ab, busy, a, b, clk, start); 

    initial begin 
    clk = 0; 
    a =8'b11100000; b =8'b00100000; start = 1; #10 start = 0; 
    end 
    always #5 clk = !clk; 

    //$strobe("ab: %d busy: %d at time=%t", ab, busy, $stime); 
endmodule 

Это код для множителя стенда Мой вопрос, когда доступны данные a и b, он начнет умножаться и продолжит, если я хочу проверить свой ответ, я должен сделать # 80 $ stop, но как я могу изменить свой код так, что когда флаг занятости будет равен нулю мой вывод должен быть на линии передачи данных и ждать другого ввода, пожалуйста, дайте мне некоторое предложение, я пытаюсь это до вчерашнего дня, я знаю, что вручную могу использовать $ finish или $ stop, но я не хочу, чтобы я автоматически хотел, чтобы мой симулятор остановился и как другой входной доступ le начнет снова, что я использую флаг занятости

+0

сэр, пожалуйста, любое предложение –

+2

Отформатируйте код, так что читаем , Добавьте в текст вопроса несколько знаков препинания и заглавных букв. –

ответ

0

Вы можете подождать, пока занят не будет отменен. Что-то вроде этого:

initial begin 
    clk = 0; 
    a =8'b11100000; b =8'b00100000; start = 1; 
    #10 start = 0; 
    @(negedge busy); // waits until busy goes from 1 to 0 
    $finish; 
    end 

Для более детального тестирования, тестирование (почти) каждый возможный вход:

initial begin 
    clk = 0; 
    for (a=8'd0;a<8'd255;a=a+1) begin 
    for (b=8'd0;b<8'd255;b=b+1) begin 
     start = 1; 
     #10 start = 0; 
     @(negedge busy); //wait until multiplier ends 
     @(posedge clk); //waits one clock cycle before moving to the next pair of numbers 
    end 
    end 

конец

+0

thank sir Я получил его –

Смежные вопросы