程序块和Systemverilog测试平台出错:

时间:2014-04-04 00:25:51

标签: debugging verilog verification system-verilog

我已经粘贴了我的verilog设计,systemverilog测试平台和错误。您可以将它们粘贴到edaplayground.com上并进行模拟。请给我建议删除错误。 我认为问题出在程序块中,但对我来说似乎没有问题。

//########################## D E S I G N ##########################################
`timescale 1 ns / 1 ns

module addsub_cy (
   opa_i,
   opb_i,
   addsub_i,
   cy_i,
   cy_o,
   rslt_o);

parameter DWIDTH = 4;

input   [DWIDTH - 1:0] opa_i; 
input   [DWIDTH - 1:0] opb_i; 
input   addsub_i;  // It will decide addition or subtracton. 1 for addition and 0 for     subtraction. 
input   cy_i; // carry_input
output   cy_o; 
output   [DWIDTH - 1:0] rslt_o; 


// --
reg     cy_o; 
reg     [DWIDTH - 1:0] rslt_o; 
reg     [DWIDTH:0]  p_addsub_v_a; //temporary register to store input a           Extra     one bit will be used to prepend carry bit.
reg     [DWIDTH:0]  p_addsub_v_b; //temporary register to store input b
reg     [DWIDTH + 1:0]  p_addsub_v_result; //temporary register to store result. 

//  process p_addsub


always @(opa_i or opb_i or addsub_i or cy_i)
   begin : p_addsub
   p_addsub_v_a[DWIDTH:1] = opa_i;   
   p_addsub_v_b[DWIDTH:1] = opb_i;   
   if (addsub_i === 1'b 1)
      begin
      p_addsub_v_a[0] = 1'b 1;   
      p_addsub_v_b[0] = cy_i;   
      p_addsub_v_result = p_addsub_v_a + p_addsub_v_b;   
      end
   else
      begin
      p_addsub_v_a[0] = 1'b 0;   
      p_addsub_v_b[0] = cy_i;   
      p_addsub_v_result = p_addsub_v_a - p_addsub_v_b;   
      end
   cy_o <= p_addsub_v_result[DWIDTH + 1];   
   rslt_o <= p_addsub_v_result[DWIDTH:1];   
   end


//  purpose: Simple adder/subtractor with carry/borrow
//  type   : combinational
//  inputs : opa_i, opb_i, addsub_i
//  outputs: cy_o, rslt_o

// --

endmodule // module addsub_cy
//###############################################################################


//########################## T E S T B E N C H     ##########################################
`timescale 1 ns / 1 ns 
module addsub_cy_tb ();

parameter DWIDTH = 4;

reg   [DWIDTH - 1:0] opa_i; 
reg   [DWIDTH - 1:0] opb_i; 
reg   addsub_i; 
reg   cy_i; 
wire   cy_o; 
wire   [DWIDTH - 1:0] rslt_o; 
//int count = 100;

addsub_cy u0 (   
   .opa_i(opa_i),
   .opb_i(opb_i),
   .addsub_i(addsub_i),
   .cy_i(cy_i),
   .cy_o(cy_o),
   .rslt_o(rslt_o)
   );

  //Instantiating program block
  test test_instance (addsub_i, opa_i, opb_i, cy_o, rslt_o);

endmodule

  parameter DWIDTH = 4;

program test(input logic addsub_i, input logic [DWIDTH - 1:0] opa_i, input logic [DWIDTH     - 1:0] opb_i, output wire cy_o, output wire [DWIDTH - 1:0] rslt_o ); 
  //ADD CARRY INPUT cy_i

  initial begin
    opa_i = 4'h0;
    opb_i = 4'h5;
    //static int count = 100;

    $display ("ADD=1/SUB=0 INPUT_A INPUT_B CARRY_OUT RESULT");
    //end  
    //initial begin
      repeat (100) begin 
        #5 opa_i = opa_i + 10;
            opb_i = opb_i + 5;
        $display ("%t %b \t %b \t %b \t %b \t %b \t %b", $time, addsub_i, opa_i, opb_i,     cy_o, rslt_o); 
        end 
    end

endprogram

//#######################################################################################

1 个答案:

答案 0 :(得分:1)

ModelSim的错误形式是分配opa_i是非法引用。这是因为program test中的输入/输出方向是相反的。 cy_i需要添加到program test和display语句中。 addsub_icy_i需要一名司机。

http://www.edaplayground.com/x/3FK
仅供参考,ModelSim不支持program,因此我将其更改为module