Verilog:可变长度寄存器的组合逻辑

Verilog : Combinatorial logic for variable length register

我正在学习 Verilog。作为第一个项目,我决定使用 SHA-1 暴力破解器。

SHA-1 需要 512 位的固定长度输入。数据输入可以是可变长度的,因此只需进行很少的操作即可获得有效的 512 位块。基本上,对于小于 512 位的块,数据块的前 448 位必须是这 3 个的串联:

  1. 变长数据
  2. 0x01(8 位)
  3. 0 填充

我生成该数据的第一步是制作一个可以生成可变长度输入的模块。假设我想暴力破解最多 8 个字符,该模块将输出一个 64 位总线(8 位 x 8 个字符)以及一个指示有效数字的 8 位总线。

例如,字符串 "test" 可以这样表示:

从那开始,我的问题是我无法根据 valid_digits 进行适当的串联并保持可配置性。

这是一段有效的代码,但针对 8 位输入进行了硬编码。我确定我可以在那里使用循环,但无法获得正确的语法。

    assign data_block[511:64] = 
        ( valid_digits == {1{1'b1}} ) ? {chars[7:0], 8'h1, 432'b0 } :
        ( valid_digits == {2{1'b1}} ) ? {chars[15:0], 8'h1, 424'b0 } :
        ( valid_digits == {3{1'b1}} ) ? {chars[23:0], 8'h1, 416'b0 } :
        ( valid_digits == {4{1'b1}} ) ? {chars[31:0], 8'h1, 408'b0 } :
        ( valid_digits == {5{1'b1}} ) ? {chars[39:0], 8'h1, 400'b0 } :
        ( valid_digits == {6{1'b1}} ) ? {chars[47:0], 8'h1, 392'b0 } :
        ( valid_digits == {7{1'b1}} ) ? {chars[55:0], 8'h1, 384'b0 } :
        ( valid_digits == {8{1'b1}} ) ? {chars[63:0], 8'h1, 376'b0 } :
        0;

任何人都知道我应该使用什么语法来使用一个循环和一个名为 MAX_CHAR_CNT 的参数重写它,该参数将包含我的数据输入的最大长度?我想将其保留为组合逻辑函数。

谢谢

这是我的尝试 - 可能不完美,但模拟效果似乎不错。如果没有别的,可能会给你一个开始。

module test(valid_digits,chars, data_block);
  parameter MAX_CHAR_CNT = 8;
  input [MAX_CHAR_CNT-1:0] valid_digits;
  input [8*MAX_CHAR_CNT-1:0] chars;
  output reg [511:0] data_block;

  wire [511:0] data_lines [MAX_CHAR_CNT-1:0];

  genvar i;
  integer x;

  generate
    for (i=0; i<MAX_CHAR_CNT; i=i+1) begin:DATA
      assign data_lines[i] = {chars[8*(i+1)-1:0], 8'h1, {(512-8*(2+i)){1'b0}}};
    end
  endgenerate

  always @(*) begin:CONN
    data_block = 0;
    for (x=0; x<MAX_CHAR_CNT; x=x+1) begin
      //if (valid_digits == {(x+1){1'b1}}) data_block <= data_lines[x];
        if (valid_digits == (9'b1<<(x+1))-1) data_block = data_lines[x];
    end
  end

endmodule

(模拟见http://www.edaplayground.com/x/FiD


回复:非阻塞分配的使用(NBA,<=)- NBA 可用于顺序逻辑或组合逻辑。对于分配给单个值的非时钟 always 块,应该没有区别 - 最终分配将是使用的那个。虽然我喜欢这个特定实例中的 NBA,但任何一个操作员都可以工作,所以为了清晰度和同伴压力,我将其切换为 BA。 :)