我在AES的verilog代码中找到了以下代码片段。
function [7:0] xtime;
input [7:0] b; xtime={b[6:0],1'b0}^(8'h1b&{8{b[7]}});
endfunction
请解释一下这是做什么的。更精细的解释越好。
答案 0 :(得分:1)
b是8位输入。
b [6:0],1'b0最后7位左移,并用0
填充^ xor
8'h1b 8位hex 1b带有符号位。
在一行中解释:如果将msb设置为xor,则为0x1b,否则为* 2
快速搜索xtime和AES会让我看到这个c实现的评论:
// xtime is a macro that finds the product of {02} and the argument to
// xtime modulo {1b}
#define xtime(x) ((x<<1) ^ (((x>>7) & 1) * 0x11b))
看起来它可能正在做同样的事情。
答案 1 :(得分:1)
让我们清理代码并细分一些任务:
function [7:0] xtime;
input [7:0] b;
reg [7:0] temp1;
reg [7:0] temp2;
begin
temp1 = {b[6:0],1'b0};
temp2 = ( 8'h1b & {8{b[7]}} );
xtime = temp1 ^ temp2;
end
endfunction
名为xtime
的函数输出变量xtime
8位宽。具有8位宽输入,称为b。
temp1
左移输入b,填充LSB(最低有效位)为0并丢弃MSB(最高有效位)。
temp2
按位AND
s 8'h1B
(8'b0001_1011),输入b的MSB。
b[7]
选择b
的第7位
{8{value}}
是复制运算符。
{8{1'b1}} => 8'b1111_1111
{4{2'b10}} => 8'b1010_1010
xtime
执行XOR
和temp1
的按位temp2
。