2015-04-15 2 views
-1

Я пишу программу, которая действует как денежный депозит. Все происходит на краю часов. Если включено значение true, а сброс - true, значение в поле сбрасывается до 0. Если включено значение true и добавлено 1, мы добавляем сумму в поле. Если включено значение true, а add - 0, мы вычитаем из поля.Добавление и вычитание значений в Verilog

Вот мой код и испытательный стенд

module cashbox(output [15:0] value, input [15:0] amount, input add,enable, clock, reset); 
reg value; 

always @(posedge clock) 
begin 
if(enable) begin 
    if(reset)begin 
    value <= 0; 
    end 
    else begin 
    if(add)begin 
    value <= value + amount; 
    end 
    else begin 
     value <= value - amount; 
     end 
    end 

end  

end 
endmodule 

// cashbox testbench 

module cashbox_tb; 
reg [15:0] amt; 
reg add, en, clk, rst; 
wire [15:0] value; 

cashbox cb(value, amt, add, en, clk, rst); 

always 
    #50 clk = ~clk; 

initial begin 
    $display("Amount in box %d", value); 
    clk = 1; en = 1; add = 1; 
    rst = 1; #10 rst = 0; 
    amt = 100; add = 1; 
    #170 en = 1; #100 en = 0; // 90 
    #20 amt = 50; add = 0; 
    #180 en = 1; #100 en = 0; // 290 
    #20 amt = 75; add = 1; 
    #180 en = 1; #100 en = 0; // 490 
    #20 amt = 35; add = 0; 
    #180 en = 1; #100 en = 0; // 690 
    #20 amt = 50; add = 0; 
    #180 en = 1; #100 en = 0; 
    #810 $finish; 
end 
endmodule 

Все компилируется, но когда я запускаю его, он отображает Количество в коробке X. Она не отображает значение

Я изменил свой испытательный стенд для этого // кассовое испытательный стенд

module cashbox_tb; 
reg [15:0] amt; 
reg add, en, clk, rst; 
wire [15:0] value; 

cashbox cb(value, amt, add, en, clk, rst); 

always 
    #50 clk = ~clk; 

initial begin 
    $monitor("Amount in box %d",value); 
    clk = 0; en = 0; add = 0; 
    rst = 1; #10 rst = 0; 
    #10 amt = 100; add = 1; 
    #170 en = 1; #100 en = 0; // 90 
    #20 amt = 50; add = 0; 
    #180 en = 1; #100 en = 0; // 290 
    #20 amt = 75; add = 1; 
    #180 en = 1; #100 en = 0; // 490 
    #20 amt = 35; add = 0; 
    #180 en = 1; #100 en = 0; // 690 
    #20 amt = 50; add = 0; 
    #180 en = 1; #100 en = 0; 
    #810 $finish; 
end 

endmodule

А теперь мой выход обратно говоря Количество в коробке X

+0

Вы не получите компиляции предупреждений ? Какой инструмент вы используете? – toolic

+0

Я использую онлайн-компилятор на tutorialspoint.com – user3370950

ответ

2

$display выполняется только на время 0. Изменение, что $monitor так, что вы получите сообщение на дисплее каждый раз value изменения:

$monitor("Amount in box %d", value); 

Вот выход я получаю с VCS:

Amount in box  0 
Amount in box  1 
Amount in box  0 

См IEEE Std 1800-2012, раздел "21.2.3 Непрерывный мониторинг".

Я получаю предупреждения компиляции с помощью VCS, и я получаю ошибку компиляции с Incisive.

Это может быть очищен путем изменения:

module cashbox(output [15:0] value, input [15:0] amount, input add,enable, clock, reset); 
reg value; 

к:

module cashbox(output reg [15:0] value, input [15:0] amount, input add,enable, clock, reset); 

После этого изменения, вот мой выход:

Amount in box  0 
Amount in box 100 
Amount in box 200 
Amount in box 150 
Amount in box 225 
Amount in box 190 
Amount in box 140 
+0

Спасибо! Моя продукция составляет 100, 200, 150, 225, 190,140 – user3370950

+0

@ user3370950: Ваш прием. См. Мой обновленный ответ. – toolic

+0

Я внесла изменения в свой код. Пожалуйста, ознакомьтесь с моим обновленным представлением – user3370950