[求助]关于parameter仿真时候的问题

parameter是定义常量的吧?那么在仿真的过程中应该以常量存在呀?
但是我定义的parameter在仿真中却是以signal的状态存在的,而且还提示我说
那些定义的parameter和上层端口没有连接,不知道什么原因?
提示的错误是 SOCK_UDP_ARP has no loads or drivers
……
有人遇到过么?还请大牛们解答!!

module state(clk,rst_N,COMMAND,TCPSIGN,PROTOCOL,timeout_a,timeout_p,timeout_t,CHANNELSTATE);
    input clk;
    input rst_N;
    input[7:0] COMMAND;
    input[7:0] TCPSIGN;
    input[7:0] PROTOCOL;
    input timeout_a;
    input timeout_p;
    input timeout_t;
    output[7:0] CHANNELSTATE;
     
    reg[7:0] CHANNELSTATE;
   
    reg[7:0] NEXTSTATE;
    parameter[7:0]  SOCK_ARP=8'b00000001,
                    SOCK_SYNSEND=8'b00000011,
                    SOCK_SYNSEND_ACK=8'b00000100,
                     SOCK_SYNREV=8'b00000101,
                    SOCK_ESTABLISHED=8'b00000110,
                    SOCK_RESET=8'b00001101,
                    SOCK_INIT=8'b00001110,                  
                    SOCK_UDP_DATA=8'b00011100,
                    SOCK_UDP_ARP=8'b00011101,
                    CLOSED=8'b0,
                    SOCK_CLOSE_WAIT=8'b00000111,
                    SOCK_LAST_ACK=8'b00001000,  
                    SOCK_FIN_WAIT1=8'b00001001,
                    SOCK_FIN_WAIT2=8'b00001010,
                    SOCK_CLOSING=8'b00001011,
                    SOCK_REV_ARP=8'b00011101,
                    SOCK_TIME_WAIT=8'b00001100;
                     
    [email=always@(posedge]always@(posedge[/email] clk or negedge rst_N) begin
    if(!rst_N) CHANNELSTATE<=SOCK_RESET;
     else CHANNELSTATE<=NEXTSTATE;
             end
    [email=always@(COMMAND]always@(COMMAND[/email] or TCPSIGN or PROTOCOL or timeout_a or timeout_p or timeout_t) begin
         case(CHANNELSTATE)
    SOCK_RESET: if(COMMAND==8'b00000010)   NEXTSTATE=SOCK_INIT;
                else if(TCPSIGN==8'b01000000)  NEXTSTATE=SOCK_REV_ARP;
                else NEXTSTATE=SOCK_RESET;
   
    SOCK_INIT:   if(PROTOCOL==8'b00000010) NEXTSTATE=SOCK_UDP_ARP;
                   else if(PROTOCOL==8'b00000001) NEXTSTATE=SOCK_ARP;
                       else  NEXTSTATE=SOCK_INIT;
                       
    SOCK_REV_ARP: if(TCPSIGN==8'b10000000) NEXTSTATE=SOCK_UDP_DATA;    //RECEIVE UDP FRAME
                  else if(TCPSIGN==8'b00010000) NEXTSTATE=SOCK_SYNREV;   
                  else if(timeout_p==1'b1)   NEXTSTATE=SOCK_RESET;
                  else  NEXTSTATE=SOCK_REV_ARP;
                     
                     
    SOCK_UDP_ARP:  if(TCPSIGN==8'b01000000) NEXTSTATE=SOCK_UDP_DATA;
                    else if(timeout_a==1'b1) NEXTSTATE=SOCK_RESET;
                    else  NEXTSTATE=SOCK_UDP_ARP;
   
    SOCK_ARP:      if(COMMAND==8'b00000100) begin
                        NEXTSTATE=SOCK_SYNSEND;
                          end
                     else if(timeout_a==1'b1) NEXTSTATE=SOCK_RESET;
                     else NEXTSTATE=SOCK_ARP;
                     
    SOCK_UDP_DATA:  if(COMMAND==8'b00010000)   NEXTSTATE=CLOSED;
                     else if(timeout_t==1)  NEXTSTATE=CLOSED;  
                     else   NEXTSTATE=SOCK_UDP_DATA;
   
    SOCK_SYNSEND:  if(TCPSIGN==8'b00000010) begin     //need to modify
                        NEXTSTATE=SOCK_SYNSEND_ACK;
                           end
                    else if(timeout_a==1'b1)  NEXTSTATE=SOCK_RESET;
   
    SOCK_SYNSEND_ACK:   if(timeout_a==1'b1)   NEXTSTATE=SOCK_RESET;
                       else                 NEXTSTATE=SOCK_ESTABLISHED;
                       
     SOCK_SYNREV:  if(TCPSIGN==8'b00000010) NEXTSTATE=SOCK_ESTABLISHED;
                 else if(timeout_p==1'b1) NEXTSTATE=SOCK_RESET;   
                   else    NEXTSTATE=SOCK_SYNREV;
                  
     SOCK_ESTABLISHED: if(TCPSIGN==8'b00100000)  NEXTSTATE=SOCK_CLOSE_WAIT;
                             else if(COMMAND==8'b0001000) NEXTSTATE=SOCK_FIN_WAIT1;
                         else  NEXTSTATE=SOCK_ESTABLISHED;  
   
     SOCK_CLOSE_WAIT: NEXTSTATE=SOCK_LAST_ACK;
                  
     SOCK_LAST_ACK:  if(TCPSIGN==8'b00000010) NEXTSTATE=CLOSED;
                     else if(timeout_t==1'b1)  NEXTSTATE=CLOSED;
                     else   NEXTSTATE=SOCK_LAST_ACK;
   
     SOCK_FIN_WAIT1: if(TCPSIGN==8'b00000010) NEXTSTATE=SOCK_FIN_WAIT2;
                     else if(TCPSIGN==8'b00100000) begin
                      NEXTSTATE=SOCK_CLOSING;
                           end
                     else if(timeout_t==1'b1) NEXTSTATE=CLOSED;
                     else NEXTSTATE=SOCK_FIN_WAIT1;
     
     SOCK_FIN_WAIT2:  if(TCPSIGN==8'b00100000) begin
                            NEXTSTATE=SOCK_TIME_WAIT;
                            end
                        else if(timeout_t==1'b1) NEXTSTATE=CLOSED;
                        else NEXTSTATE=SOCK_FIN_WAIT2;
     
     SOCK_CLOSING:
                       if(TCPSIGN==8'b00000010) begin
                           NEXTSTATE=SOCK_TIME_WAIT;
                                end
                      else if(timeout_t==1'b1) NEXTSTATE=CLOSED;
                      else NEXTSTATE=SOCK_CLOSING;
                                          
     SOCK_TIME_WAIT:  if(timeout_t==1'b1) begin
                           NEXTSTATE=CLOSED;
                                end
                      else NEXTSTATE=SOCK_TIME_WAIT;
   
     CLOSED:       NEXTSTATE=CLOSED;
endcase
   
   
   
end



其实就是一个状态机,把状态变量定义成参数




[ 本帖最后由 xjtu_zhanglei 于 2008-8-26 17:38 编辑 ]
我也来说两句 查看全部回复

最新回复

  • xjtu_zhanglei (2008-8-27 10:02:08)

    没人知道么?
    自己******
  • xjtu_zhanglei (2008-8-27 15:05:01)

    如果是如下的代码:

    parameter a=8'b00001111;
    [email=always@(posedge]always@(posedge[/email] clk) begin
    b<=a;
    end



    那么a 算是常数还是signal?
    我理解的是常数,但是hierarchy窗口中a显示的是signal
    有高手能解答的么?
  • 店小二 (2008-8-27 18:35:20)

    这个问题还真没注意过 刚才用modelsim看了一下我觉得应该算是常数 不知你怎么看出的它是个signal呢?
    至于你说的这个问题我也不大明白,希望高手能指点一下为何有这个错误
    还有就是建议你把参数给去掉直接用值,看还会出现错误吗
  • clwyl (2008-8-27 18:48:23)

    QUOTE:

        parameter[7:0]  SOCK_ARP=8'b00000001,
                        SOCK_SYNSEND=8'b00000011,
                        SOCK_SYNSEND_ACK=8'b00000100,
                         SOCK_SYNREV=8'b00000101,
                        SOCK_ESTABLISHED=8'b00000110,
                        SOCK_RESET=8'b00001101,
                        SOCK_INIT=8'b00001110,                  
                        SOCK_UDP_DATA=8'b00011100,
                        SOCK_UDP_ARP=8'b00011101,
                        CLOSED=8'b0,
                        SOCK_CLOSE_WAIT=8'b00000111,
                        SOCK_LAST_ACK=8'b00001000,  
                        SOCK_FIN_WAIT1=8'b00001001,
                        SOCK_FIN_WAIT2=8'b00001010,
                        SOCK_CLOSING=8'b00001011,
                        SOCK_REV_ARP=8'b00011101,
                        SOCK_TIME_WAIT=8'b00001100;
    parameter 后面不用定义位宽 [7:0],你把这个去掉应该就好了。
  • 店小二 (2008-8-27 18:54:47)

    这个我也想过 应该说是否定义位宽都是可以的 不定义的话默认的是32位
    那本黄金手册里面说定义位宽是不标准的写法但现在大多数仿真工具也是支持的,
    楼主应该是在VCS下仿的,也许VCS不支持定义位宽
    但大牛Clifford E. Cummings貌似很喜欢定义位宽

    [ 本帖最后由 店小二 于 2008-8-27 18:57 编辑 ]
  • clwyl (2008-8-27 18:58:16)

    哈哈。刚才用modelsim-SE6.4仿真了一个例子程序,特意定义了位宽,也没问题。
    莫非是他的仿真器的问题?
    请问搂主用的什么仿真器啊?你怎么看出来这个仿真器把parameter认为是signal呢?
  • xjtu_zhanglei (2008-8-27 23:12:39)

    首先感谢大家的回复
    我在modelsim中也仿过没问题,
    现在用vcs仿的,主要是想用到vcs里面的trace信号的功能


    在hierarchy窗口中这些定义的参数都会显示为signal(就是选择signal和port的那个选项,选择signal的时候那些定义的参数都列在里面)
    楼上各位说过的问题我也试过,把位宽去掉也没用,还是一样
    不知道怎么回事
    还请大牛们解答
  • xjtu_zhanglei (2008-9-09 14:15:12)

    按照楼上各位的方法,将位宽也去掉了
    还是回出现这个问题
    把定义的参数当成了signal,无奈了
    [localimg=400,300]2[/localimg]!

    [ 本帖最后由 xjtu_zhanglei 于 2008-9-9 14:26 编辑 ]