我在systemverilog中的输入是以位为单位的;但是我需要它在uint 8_t中。API或库可以做到吗?仅供参考,我试图使用“dpi”验证.C的verilog结果。
系统验证:
//import "DPI-C" function int test_encrypt_ecb();
import "DPI-C" function void compute_bit(input bit i_value, output bit result);
import "DPI-C" function bit get_bit(input bit i_value);
import "DPI-C" function void compute_logic_vector(reg[127:0] i_value, reg[127:0] result, int asize);
丙:
x一个一个一个一个x一个一个二个x
c编译错误
warning: passing argument 2 of \f2\u2019 from incompatible pointer type [enabled by default]
note: expected \u2018uint8_t *\u2019 but argument is of type \u2018const struct svLogicVecVal *\u2019
void f2(const struct AES_ctx* ctx, uint8_t* buf);
warning: \u2018main\u2019 is normally a non-static function [-Wmain]
int main(void)
1条答案
按热度按时间2w3kk1z51#
没有API函数可以将svLogicVecVal转换为其他C类型。您必须了解4状态(0,1,X,Z)数据类型的C数据结构表示,即
一个128位的压缩4态值将存储在一个8个32位字的数组中。aval/bval字将交织在一起。假设您只处理2态值,那么每隔一个32位字拾取一次就可以了。
但是,如果您知道DPI例程只需要处理2状态值,那么您的例程应该使用
bit
而不是reg/logic
,然后您的C例程只需要处理svBitVecVal,它定义为只要你的参数是8位的倍数,你就可以将其转换为
uint8_t*
。注意对于单位参数或返回值,使用C兼容类型(如byte/int)会更有效,因为它可以通过值传递,并且不需要指针。下面是一个小例子
系统Verilog代码:
C代码:
运行奎斯塔的命令行:
输出: