我已经粘贴了我的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
//#######################################################################################
答案 0 :(得分:1)
ModelSim的错误形式是分配opa_i
是非法引用。这是因为program test
中的输入/输出方向是相反的。 cy_i
需要添加到program test
和display语句中。 addsub_i
和cy_i
需要一名司机。
http://www.edaplayground.com/x/3FK
仅供参考,ModelSim不支持program
,因此我将其更改为module
。