从书上摘抄的一段代码,却综合不了~(求教)

module bianhuan1(sum,clk,reset,data);
output        [5:0] sum;
input         [3:0] data;
input                 clk,reset;
reg sum;
always@(posedge clk)begin:loop
if(reset) disable loop;else sum<=data;
@(posedge clk)if(reset)disable loop;else sum<=sum+data;
   @(posedge clk)if(reset)disable loop;else sum<=sum+data;
          @(posedge clk)if(reset)disable loop;else sum<=sum+data;
end
endmodule
红色字体为出问题的地方。使用的XST综合(因为不太明白这段代码的含义,所以想用ISE试试,结果发现语句不规范),向大家求教这是为什么呢?


截图00.jpg


我也来说两句 查看全部回复

最新回复

  • ococ (2008-10-14 13:30:28)

    一个always里面只能有一个时钟事件吧。不太懂V。
    ISE环境下使用VHDL每个进程里面只允许一个时钟事件的。
  • puma0329 (2008-10-14 13:43:56)

    是不是用别的综合软件就能综合呢?
  • almer (2008-10-14 14:03:46)

    还真没见过这样的
  • ococ (2008-10-14 14:26:23)

    我也不知道别的综合工具能否综合。不过感觉这样的代码很别扭,肯定不是推荐的编码风格。
  • 等待寒秋 (2008-10-14 14:30:48)

    楼主可把问题简单化,如下:
    always@(posedge clk)begin
    @(posedge clk)sum<=1;
    end
    这段语句在simulation不会报错,但是综合会出错的。
    你要很清楚硬件电路描述语言的定义,心中有电路,如上的描述你能想出它的电路模型?
    你都不能,综合器更不能,至少ise是这样。
    关键是,rtl code中是不会出现这样的语句的,写这样的语句出来本身就代表你写错了
    你所说的教材也许它的目的是为了演示disabel如何使用,不过它的确误导了你
  • puma0329 (2008-10-14 15:08:01)

    图片奉上,这是综合出来的电路~


    20081009191.jpg

  • puma0329 (2008-10-14 15:08:46)

    图片奉上,这是综合出来的电路~


    20081009191.jpg

  • ouyang (2008-10-14 15:52:34)

    代码应该没错,而且DC应该可以综合,FPGA软件可能不行
  • hover_edacn (2008-10-14 16:01:45)

    ISE不支持这种描述方式,这段代码应该是实现对连续4个输入数据实现求和。
    这段代码是可以被综合的,不过这不是一个好的代码风格,通常数据通路和控制逻辑是分开设计的。
    不可否认该书的作者是个高手,不过他更多的是偏重于学术研究而非工程实践。如果说软件工程师写出诡异的代码可以减少程序存储空间还有情可原,作为ASIC工程师求追求代码的高效,除了带来更高的风险之外并不会带来任何物质利益(一次流片失败有可能毁掉一个公司)。
  • 等待寒秋 (2008-10-14 16:24:39)

    always@(posedge clk)begin:loop
    if(reset) disable loop;else sum<=data;
    @(posedge clk)if(reset)disable loop;else sum<=sum+data;
       @(posedge clk)if(reset)disable loop;else sum<=sum+data;
              @(posedge clk)if(reset)disable loop;else sum<=sum+data;
    end
    去掉reset判断,其实相当于
    always@(posedge clk)begin
    sum<=data;
    @(posedge clk)sum<=sum+data;
       @(posedge clk)else sum<=sum+data;
              @(posedge clk)else sum<=sum+data;
    end
    ==如下(化为simulation时做法):
    initial forever
    begiin
    @(posedge clk) sum<= sum+data;
    @(posedge clk) sum<= sum+data;
    @(posedge clk) sum<= sum+data;
    @(posedge clk) sum<= sum+data;
    end
    ==如下:
    initial forever
    begiin
    @(posedge clk) sum<= sum+data;
    end

    ==如下:
    always @(posedge clk)sum<=sum+data

    就是一个加法,我不晓得为什么教材会用那么诡异的方式,一定是为了验证什么。楼主看看标题啊什么的,看看这章节讲
    些什么东西。
    ise我试过,那种写法是不过的,语言本来就是工具,有的综合器能看懂那是它的事,正规军(大部队)看不懂(如ise)我还是觉得就证明那种写法是错的。我相信ise是支持必要的所有的语法的。
    verilog标准本就有些东西不确定的,仔细找你一定能发现有些语法在不同的仿真器下跑出来的结果都不一样。
    不必太钻牛角尖哈,功力高低不是看你对语法,标准研究的怎么样。
    如果是我,我就把它当成是错的,无视之。这作者浪费人时间,哎,估计是实验室待久了,理论搞多了

    [ 本帖最后由 等待寒秋 于 2008-10-14 16:27 编辑 ]
  • puma0329 (2008-10-14 19:09:41)

    呵呵~十分感谢LS的讲解...
  • wu.weihai (2008-10-14 21:51:12)

    ==如下:
    always @(posedge clk)
    if (reset)sum<=data;
    else sum<=sum+data;

    [ 本帖最后由 wu.weihai 于 2008-10-14 21:52 编辑 ]
  • wu.weihai (2008-10-14 21:51:49)

    同步置位的加法器