【问题标题】:Is there a more concise way to write the assign for this wire in Verilog?有没有更简洁的方法在 Verilog 中为这条线编写分配?
【发布时间】:2012-10-17 05:45:30
【问题描述】:

只是试图为所有寄存器和索引创建一条线finished,如果data == dataNew 是真的,那么它是真的。我能想到的唯一方法是使用一堆finishedAgg 电线作为中间值;我很想摆脱它们,但我不知道该怎么做。似乎有 比这更简单!

reg[24:0] data[0:24];
reg[24:0] dataNew[0:24];

wire finished;

genvar i;
generate
    wire finishedAgg[-1:24];
    assign finishedAgg[-1] = 1;
    for (i=0; i<25; i=i+1) begin :b1
        assign finishedAgg[i] = finishedAgg[i-1] & (data[i]==dataNew[i]);
    end
    assign finished = finishedAgg[24];
endgenerate

【问题讨论】:

    标签: verilog


    【解决方案1】:

    这是我的观点:

    reg [24:0] finishAgg;
    wire finished;
    always @(*)
        for (int i=0; i<25; i=i+1) begin :b1
            finishedAgg[i] = (data[i]==dataNew[i]);
        end : b1
    assign finished = &finishedAgg;
    

    它不会比你的版本短太多,但它不需要generate 块。我已经声明了i in-loop Systemverilog 样式,并且我正在使用归约与来生成finished 信号。

    【讨论】:

    • 我很惊讶地看到它编译成完全相同的注册数和门数。我是一名 Verilog 新手,对于将 regs 放在那里但实际上并不能编译为 regs 有点害怕;它使它看起来像它不是的东西。这是常见的做法吗?
    • 这是很常见的做法,欢迎使用verilog! reg 不一定编译成触发器或锁存器,这取决于它的使用方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    相关资源
    最近更新 更多