(已解决, 自己搞错方向 sorry)
小弟根据参考书籍写一个测试,
在
连接Testbench跟Arbiter之间用Interface时, 没问题
但
改用port的时候会出现error
有点不解原因, 希望好心人帮我解惑Q_Q
// Environment:
// EDA playground
// Tool & Sim. = Synopsys VCS 2019.06
`include "arb_if.sv"
`include "myArb.sv"
`include "myTest.sv"
module top;
bit clk;
always #50 clk = ~clk;
arb_if arbif (clk);
/*
this one is executable
arb_with_ifc a1 (arbif);
*/
/*
this one will fail with error: */
/*
The port 'arbif' of module 'arb_with_ifc' whose type is interface
'arb_if' is left unconnected.
It is illegal to leave the interface ports unconnected.
The interface instance is 'a1' in file testbench.sv at line 16.
Please make sure that all the interface ports are connected.
*/
arb_with_ifc a1 (
.grant (arbif.grant),
.request (arbif.request),
.rst (arbif.rst),
.clk (arbif.clk));
test_with_ifc t1 (arbif);
endmodule : top
Appendix -------------- arb_if.sv
interface arb_if(input bit clk);
logic [1:0] grant, request;
bit rst;
endinterface
Appendix -------------- myArb.sv
module arb_with_ifc (arb_if arbif);
always @(posedge arbif.clk or posedge arbif.rst)
begin
$display("ARB %0t: req = %p, gnt = %p, rst = %p", $time, arbif.request,
arbif.grant, arbif.rst);
if (arbif.rst) begin
arbif.grant <= '0;
$display("ARB %0t: req = %p, gnt = %p, rst = %p(1'b1)", $time, arbif.
request, arbif.grant, arbif.rst);
end
else if (arbif.request[0]) begin
arbif.grant <= 2'b01;
$display("ARB %0t: req = %p(2'bx1), gnt = %p, rst = %p", $time, arbif.
request, arbif.grant, arbif.rst);
end
else if (arbif.request[1]) begin
arbif.grant <= 2'b10;
$display("ARB %0t: req = %p(2'b1x), gnt = %p, rst = %p", $time, arbif.
request, arbif.grant, arbif.rst);
end
else begin
arbif.grant <= '0;
$display("ARB %0t: req = %p(else), gnt = %p, rst = %p", $time, arbif.
request, arbif.grant, arbif.rst);
end
end
endmodule
Appendix -------------- myTest.sv
module test_with_ifc (arb_if arbif);
initial begin
@(posedge arbif.clk);
arbif.request <= 2'b01;
$display("TEST %0t: Drove req = %p(01), gnt = %p, rst = %p", $time, arbif.
request, arbif.grant, arbif.rst);
repeat (2) begin @(posedge arbif.clk);
$display("TEST (%0t) test", $time);
end
$display("TEST %0t: req = %p, gnt = %p, rst = %p", $time, arbif.request,
arbif.grant, arbif.rst);
if (arbif.grant != 2'b01)
$display("TEST %0t: Error! reg = %p, gnt = %p != 2'b01, rst = %p", $time,
arbif.request, arbif.grant, arbif.rst);
else
$display("TEST %0t: Success! reg = %p, gnt = %p == 2'b01, rst = %p", $
time, arbif.request, arbif.grant, arbif.rst);
$finish;
end
endmodule
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.110.78.153 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Electronics/M.1573360993.A.047.html
自问自答:
top的a1从interface改用port,
是为了arb_with_ifc是用port的写法的case
Appendix -------------- myArb.sv
module arb_with_ifc (output logic [1:0] grant,
input logic [1:0] request,
input bit rst, clk);
always @(posedge clk or posedge rst)
begin
$display("ARB %0t: req = %p, gnt = %p, rst = %p", $time, request, grant,
rst);
if (rst) begin
grant <= '0;
$display("ARB %0t: req = %p, gnt = %p, rst = %p(1'b1)", $time, request,
grant, rst);
end
else if (request[0]) begin
grant <= 2'b01;
$display("ARB %0t: req = %p(2'bx1), gnt = %p, rst = %p", $time, request
, grant, rst);
end
else if (request[1]) begin
grant <= 2'b10;
$display("ARB %0t: req = %p(2'b1x), gnt = %p, rst = %p", $time, request
, grant, rst);
end
else begin
grant <= '0;
$display("ARB %0t: req = %p(else), gnt = %p, rst = %p", $time, request,
grant, rst);
end
end
endmodule
※ 编辑: homer00 (123.110.78.153 台湾), 11/10/2019 13:23:07
1F:→ leonyun: 哇~难得电子会看到程式的文章 11/10 19:26
2F:→ leonyun: 板 11/10 19:26