打印

一个system verilog的问题,求行家解决

[复制链接]
4436|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sahh|  楼主 | 2012-8-20 17:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sahh 于 2012-8-21 09:48 编辑

代码用modelsim仿真,vlog已经过了,但是vsim报错。

** Fatal: (vsim-3695) ../src/ram_256x40/block_ram_256x40_wrap.sv(0): The interface port 'port_a' must be passed an actual interface.

代码如下:


interface block_ram_IF;
      logic [7:0]     block_addr_wr;
      logic             block_wren;
      logic [39:0]   block_data_wr;
      wire             clk_block_wr;
      logic [7:0]     block_addr_rd;
      logic [39:0]   block_data_rd;
      wire              clk_block_rd;
modport to_block_ram (
  output  clk_block_wr,
  output  clk_block_rd,
  output  block_wren,
  output  block_addr_wr,
  output  block_data_wr,
  output  block_addr_rd,
  input  block_data_rd
);
modport block_ram (
  input  clk_block_wr,
  input  clk_block_rd,
  input  block_wren,
  input  block_addr_wr,
  input  block_data_wr,
  input  block_addr_rd,
  output  block_data_rd
);
endinterface

module block_ram_256x40_wrap (
input   mode,
input   a_b,
block_ram_IF.block_ram port_a,
block_ram_IF.block_ram port_b,
block_ram_IF.block_ram port_c
);

wire [7:0] wraddress;
wire   wrclock;
wire   wren;
wire [39:0] data;
wire   rdaddress;
wire   rdclock;
wire [39:0] q;

assign wraddress = (a_b) ? port_a.block_addr_wr : port_b.block_addr_wr;
assign wrclock   = (a_b) ? port_a.clk_block_wr : port_b.clk_block_wr;
assign wren   = (mode) ? ((plot_a_b) ? port_a.block_wren : port_b.block_wren) : 1'b0;
assign data   = (a_b) ? port_a.block_data_wr : port_b.block_data_wr;
assign rdaddress = (mode) ? ((a_b) ? port_a.block_addr_rd : port_b.block_addr_rd) : port_c.block_addr_rd;
assign rdclock   = (mode) ? ((a_b) ? port_a.clk_block_rd : port_b.clk_block_rd) : port_c.clk_block_rd;
assign port_a.block_data_rd = q;
assign port_b.block_data_rd = q;
assign port_c.block_data_rd = q;

ram_256x40 u_block_ram (
// write
.wraddress ( wraddress ), // input [7:0]
.wrclock ( wrclock ), // input
.wren  ( wren ),  // input
.data  ( data ),  // input [39:0]
// read
.rdaddress ( rdaddress ), // input [7:0]
.rdclock ( rdclock ), // input
.q   ( q )   // output [39:0]
);

endmodule

相关帖子

沙发
sahh|  楼主 | 2012-8-20 17:36 | 只看该作者
我反复对照过system verilog的语法书,应该没有语法错误。

而且,用vlog编译也能过了。

但是仿真的时候就报错。郁闷ing....

搞不下去了,请老大、前辈指点指点,

谢谢了

使用特权

评论回复
板凳
GoldSunMonkey| | 2012-8-20 21:54 | 只看该作者
是不是使用到库,库没有编译呢?

使用特权

评论回复
地板
sahh|  楼主 | 2012-8-21 18:42 | 只看该作者
自己解决了。

通常一个模块,它的端口不接东西,midelsim是允许的,仿真的时候不会报错。

但是如果端口是interface类型的,modelsim不允许interface类型的接口悬空不接。

所以,把接口接好,不要悬空,就好了。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
GoldSunMonkey + 2 解决就好。
5
GoldSunMonkey| | 2012-8-21 20:22 | 只看该作者
喜欢解决后,恢复解决方案的兄弟。

使用特权

评论回复
6
mcu8031| | 2012-8-24 11:24 | 只看该作者
请问ise支持system erilog了吗

使用特权

评论回复
7
abcsmile| | 2012-8-24 16:58 | 只看该作者
我是来学习的,哈哈

使用特权

评论回复
8
liugp25| | 2012-8-24 17:05 | 只看该作者
学习了

使用特权

评论回复
9
gool| | 2012-8-24 17:13 | 只看该作者
学习一下

使用特权

评论回复
10
GoldSunMonkey| | 2012-8-24 19:05 | 只看该作者
:)

使用特权

评论回复
11
nju044| | 2012-10-24 15:57 | 只看该作者
sahh,你好:我错误和你一样:Fatal: (vsim-3695) E:/kn/src_questasim100c/SV4Veri_2nd/chap4/4.4.2/test.sv(0): The interface port 'arbif' must be passed an actual interface.不过没明白你怎么解决的。。。我初学SV,希望能帮忙一下,谢谢!附件是程序,非常简单。 4.4.2.rar (121.08 KB)

使用特权

评论回复
12
loansat| | 2012-10-24 17:49 | 只看该作者
学习一下

使用特权

评论回复
13
xjsxjtu| | 2012-10-24 23:45 | 只看该作者
:)对system verilog,完全不懂。

使用特权

评论回复
14
jakfens| | 2012-10-25 14:00 | 只看该作者

使用特权

评论回复
15
GoldSunMonkey| | 2012-10-25 17:05 | 只看该作者

jakfens 发表于 2012-10-25 14:00
怎么了?

使用特权

评论回复
16
tuqiaozi| | 2014-5-26 07:20 | 只看该作者
sahh 发表于 2012-8-21 18:42
自己解决了。

通常一个模块,它的端口不接东西,midelsim是允许的,仿真的时候不会报错。

你好,我也遇到了一模一样的问题,按照你说的,在所有module中都连接了interface中定义的信号,但是该问题依然存在啊,我的程序如下,请帮忙看看吧,谢啦。
interface alu_if(input bit clk);
  logic a,b,rst;
  logic f1,f2;
  
  modport ALU (output f1,
               output f2,
               input clk,
               input rst,
               input a,
               input b);
  modport ALU_TEST (input clk,
                    output rst,
                    output a,
                    output b);
  
endinterface

`timescale 1ns/100ps

module alu_test(alu_if.ALU_TEST aluif);
  initial begin
    @(posedge aluif.clk);
    aluif.rst <= 1'b1;
    repeat(2)@(posedge aluif.clk);
    aluif.rst <= 1'b0;
    repeat(2)@(posedge aluif.clk);
    aluif.rst <= 1'b1;
   
    @(posedge aluif.clk);
    aluif.a <= 1'b0;
    aluif.b <= 1'b0;
   
    repeat(100)@(posedge aluif.clk);
    $finish;
  end
  
  always #10 aluif.a <= aluif.a + 1;
  always #20 aluif.b <= aluif.b + 1;
  
endmodule : alu_test

module alu(alu_if.ALU aluif);
  always@(posedge aluif.clk or negedge aluif.rst)
  begin
    if(!aluif.rst)
      begin
        aluif.f1 <= 1'b0;
        aluif.f2 <= 1'b0;
      end
    else
      begin
        aluif.f1 <= aluif.a + aluif.b;
        aluif.f2 <= aluif.a - aluif.b;
      end
  end
endmodule

`timescale 1ns/100ps

module alu_top;
  bit clk;
  always #5 clk=~clk;
  
  alu_if aluif(clk);
  alu al(aluif);
  alu_test at(aluif);
endmodule : alu_top

使用特权

评论回复
17
andous| | 2014-5-26 18:47 | 只看该作者
恭喜恭喜

使用特权

评论回复
18
雄飞| | 2019-10-24 07:14 | 只看该作者
tuqiaozi 发表于 2014-5-26 07:20
你好,我也遇到了一模一样的问题,按照你说的,在所有module中都连接了interface中定义的信号,但是该问 ...

你好,我也遇到这样的问题,我的代码结构和你的一模一样,我想请教一下,你是怎么解决的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

224

帖子

0

粉丝