动态转换从无符号到签名的specman

时间:2016-02-23 09:43:49

标签: specman

我正在尝试使用“as_a(int(bits :))”将specman中的无符号转换为带符号的数字。 我的问题是,这是一个动态的东西,从一个数字变为另一个数字。

当尝试传递一个变量时,我收到的错误是只能使用常数。

有没有办法克服这个问题?我尝试过使用宏,但也没有帮助。

2 个答案:

答案 0 :(得分:1)

我想我明白你要做的事情:你有一些数字作为uint,并以某种方式知道它"自然"比特大小,然后你需要将其转换为无符号的方式,根据该位大小,前导0或1是正确的。正确?

我不知道如何将可变位大小用于整数。这似乎是唯一可行的解​​决方案,如果你想使用原生的' e'转换,是将所有可能的位大小转换硬编码并根据位大小变量使用相关的情况。它可以使用宏生成相对少量的代码。

但也许你真的不需要as_a()?您可以使用位移实现正确的符号扩展:将您的变量转换为int,然后在距离32减去bit_size时来回移动它。最后你应该得到你期望的值作为int:如果它对你的位大小有利,它将是相同的正数,如果它应该是负数,它将是负数正确的价值。

答案 1 :(得分:0)

以下函数将unsigned int(bits:*)转换为以给定位数签名:

unsigned_to_signed(uval : int(bits:*), sz : uint, fix_range : bool = FALSE) : int(bits:*) is {
    assert(sz > 0) else error("unsigned_to_signed error: size must be possitive !");
    var max_val : int(bits:*) = 1.as_a(int(bits:*)) << sz;
    if (fix_range && uval >= max_val) { // fix uval to be in the range
        uval = (uval & (max_val -1));
    };
    assert (uval >= 0 && uval < max_val) else error(appendf("unsigned_to_signed error: uval is not in a valid range for int(bits:%u) !",sz));
    var sign_bit : int(bits:*) = 1.as_a(int(bits:*)) << (sz-1);
    if (uval < sign_bit) {
        return uval;
    } else {
        return -(max_val-uval);
    };
};

用法示例:

print unsigned_to_signed( (1).as_a(uint) , 8);
print unsigned_to_signed( (-1).as_a(uint(bits:8)) , 8);
print unsigned_to_signed( (127).as_a(uint) , 8);
print unsigned_to_signed( (-128).as_a(uint(bits:8)) , 8);
print unsigned_to_signed( (237).as_a(uint) , 9);
print unsigned_to_signed( (-237).as_a(uint(bits:9)) , 9);
print unsigned_to_signed( (-237).as_a(uint) , 9, TRUE);