我正在学习Verilog。作为第一个项目,我决定选择SHA-1暴力破坏者。
SHA-1需要512位的固定长度输入。数据输入可以是可变长度的,因此必须进行很少的操作才能获得有效的512位块。基本上,对于小于512位的块,数据块的前448位必须是这3位的串联:
生成该数据的第一步是创建一个可以生成可变长度输入的模块。假设我想强制最多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的参数,它包含我的数据输入的最大长度?我想保持这个组合逻辑功能。
谢谢
答案 0 :(得分:0)
这是我对它的刺痛 - 可能不完美,但似乎模拟确定。如果不出意外,可能会给你一个开始。
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进行模拟)
Re:使用非阻止分配(NBA,<=
) - NBAs可用于顺序逻辑或组合逻辑。对于分配给单个值的非时钟always
块,应该没有区别 - 最终分配将是使用的。虽然我在这个特定的例子中喜欢NBA,但是任何一个操作员都可以工作,所以我已经将它转换为BA以获得清晰度和同伴压力。 :)