kj004 发表于 2010-11-3 14:58:22

verilog这样写有问题吗?

如下所示,请大家帮忙看一下,标注部分的内容,是否可以这样?

always @(posedge Clk or negedge Rst_n)
begin
if (!Rst_n) begin
    DataInVld <= #1 0 ;
    DataIn    <= #1 0 ;
    ByteSel   <= #1 0 ;
end
else begin
    DataInVld <= #1 0 ;//-----------先是这里
    DataIn    <= #1 0 ;
    ByteSel   <= #1 0 ;
    if(OpVld) begin
      DataInVld <= #1 1'b1 ;//-----------然后是这里
      case(OpCmd)
      CMD_RST       : begin
          DataIn<= #1 {OpCmd, 24'd0};
          ByteSel <= #1 4'b1000      ;
      end
      CMD_RD, CMD_WR: begin
          DataIn<= #1 {OpCmd, OpAddr, OpData, 8'd0};
          ByteSel <= #1 4'b1110 ;
      end
      CMD_RD_STATUS, CMD_RX_STATUS : begin
          DataIn<= #1 {OpCmd, 24'd0};
          ByteSel <= #1 4'b1110 ;
      end
      CMD_MODIFY    : begin
          DataIn<= #1 {OpCmd, OpAddr, OpMask, OpData};
          ByteSel <= #1 4'b1111 ;
      end
      CMD_BURST   : begin
          DataIn<= #1 {OpData,24'd0} ;
          ByteSel <= #1 4'b1000 ;
      end
      default       : begin
          DataInVld <= #1 0 ;
          DataIn    <= #1 0 ;
          ByteSel   <= #1 0 ;
          if(OpCmd == CMD_RTS) begin
            DataInVld <= #1 1'b1 ;
            DataIn    <= #1 {OpCmd, 24'd0};
            ByteSel   <= #1 4'b1000      ;
          end
      end
      endcase
    end
end
end

gwh1128 发表于 2010-11-3 15:11:21

延时 像 #1 是不能综合的,也就是在实际电路中是没用的,所以你这样是不能实现的

kj004 发表于 2010-11-3 15:12:10

嗯,这个我知道,我想知道的是,注释部分的代码,合理吗?
由于FPGA的并行执行的,那么如果if(OpVld)条件满足了,那么DataInVld 究竟是0还是1啊?

gwh1128 发表于 2010-11-3 15:19:02

这个我也不知道,没具体试过,感觉应该是1(应该跟c一样吧),前面的那句可能会被编译器优化掉,你可以仿真试试

denike 发表于 2010-11-3 15:23:28

回复【2楼】kj004
-----------------------------------------------------------------------

答案是这个DataInVld <= #1 1'b1

leilei2268967 发表于 2010-11-8 17:54:51

这种语句要尽量避免的,虽然仿真出来结果是对的,但是这样做不便系统布局布线,也不利于后期添加时序约束
页: [1]
查看完整版本: verilog这样写有问题吗?